zoukankan      html  css  js  c++  java
  • [.NET] 使用ValidationContext快速进行模型资料的验证

    在进行WebAPI功能开发的时候,一般传统的验证资料是否合法的方式,都是透过if/else的方式进行判断
    若是使用ValidationContext,就可以省去很多自行撰写程式码的工作

    要使用ValidationContext的验证方式很简单,我先用一个简单的例子来说明就可以呈现所需要的结果

    1.首先先在专案中建立一个新的模型档案,并在模型档案中加入下面的程式码

    public class ValidModels
    {
        /// <summary>
        /// 輸入資料的模型
        /// </summary>
        public class ValidInfoQuery
        {
            [Required]
            public string Name { get; set; }
            public string Tel { get; set; }
            public string Address { get; set; }
            [Required]
            [Range(1, 130)]
            public int Age { get; set; }
            [Required]
            public DateTime Birthday { get; set; }
        }
    
        /// <summary>
        /// 回傳驗證結果的模型
        /// </summary>
        public class ValidInfoResult
        {
            public bool IsValid { get; set; }
            public List<ValidItem> List { get; set; }
            public class ValidItem
            {
                public IEnumerable<string> Field { get; set; }
                public string Message { get; set; }
            }
        }
    }
    

      

    在这个模型中,我们定义了要输入的资料模型,以及要回传的模型定义,在输入的模型ValidInfoQuery中,特别在"Name"、"Age"、"Birthday"三个栏位中,加上[Required]的属性。并且在"Age"的栏位中,加入[Range(1, 130)]的属性,代表Age的合法值在1到130之间

    2.接着加入一个新的控制器"ValidController.cs",加入一个POST的方法,并将刚刚新增的模型,分别放入Input以及Output的参数

    public class ValidController : ApiController
    {
        /// <summary>
        /// 執行資料寫入的Post動作
        /// </summary>
        /// <param name="query"></param>
        public Models.ValidModels.ValidInfoResult Post(Models.ValidModels.ValidInfoQuery query)
        {
    
        }
    }
    

      3.一般传统进行输入资料验证的方式,会采用下面的方式进行验证

    // 傳統欄位驗證的寫法
    
    // 驗證Name欄位
    if (string.IsNullOrEmpty(query.Name))
    {
        result.IsValid = false;
        result.List.Add(new Models.ValidModels.ValidInfoResult.ValidItem()
        {
            Field = new List<string> { "Name" },
            Message = "Name欄位必填"
        });
    }
    
    // 驗證Age欄位
    if (query.Age > 130 || query.Age < 1)
    {
        result.IsValid = false;
        result.List.Add(new Models.ValidModels.ValidInfoResult.ValidItem()
        {
            Field = new List<string> { "Age" },
            Message = "Age欄位必須在1與130之間"
        });
    }
    

      但是这样的写法,一但Input模型的栏位增加的话,程式码也会相对的增加。也会影响程式码的效率。所以我们将验证的方式更改一下,改为ValidationContext进行验证

    // 使用ValidationContext的驗證物件
    // 定義ValidationContext的驗證物件
    var context = new ValidationContext(query);
    
    // 定義進行Validation回傳的訊息
    var validationResults = new List<ValidationResult>();
    
    // 進行驗證動作
    bool isValid = Validator.TryValidateObject(query, context, validationResults, true);
    
    // 將驗證結果進行處理,並回傳到指定的回傳物件中
    result.IsValid = isValid;
    result.List = validationResults.Select(c => new Models.ValidModels.ValidInfoResult.ValidItem()
                                    {
                                        Field = c.MemberNames,
                                        Message = c.ErrorMessage
                                    })
                                    .ToList();
    

      

    从上面的程式码可以很清楚的看到,只要定义出一个ValidationContext物件,并将要验证的模型资料传入,就可以在TryValidateObject的方法中,将所有资料不合法的栏位进行验证并得到结果

    4.程式码完成后,我们实际执行刚刚的程式内容,并透过Swagger进行资料的输入。其中Name的栏位以及Age的栏位我刻意输入了不合法的内容

     

    按下"Try it"之后,得到的结果如下图所示

    可以看到,在结果的显示上,很清楚的列出"Name "与"Age"两个栏位是验证失败的,也显示了为什么发生错误的讯息内容

    透过ValidationContext的验证方式,除了可以很快的完成模型资料的合法性验证外,也可以大量的减少撰写验证资料的程式码,提升程式效率与开发速度

    范例程式下载
    https://github.com/madukapai/maduka-WebAPI

  • 相关阅读:
    Ubuntu 12.10 安装破解sublimetext 2
    封装一个类型转换的方法
    【转】CultureInfo中重要的InvariantCulture
    C# 36进制转10进制
    用泛型的IEqualityComparer<T>接口去重复项
    关于wamp启动是80端口被占用的问题详解(win7系统下WAMP 80端口被MicrosoftHTTPAPI/2.0占用的解决办法)
    Ubuntu 更改鼠标滚轮速度
    edge ctrl+c 复制不起作用
    centos 7 mysql8 安装和卸载
    Windows Terminal 终端 SSH连接centos7 linux
  • 原文地址:https://www.cnblogs.com/wwwblender-3dcn/p/10234889.html
Copyright © 2011-2022 走看看