一、模型状态 - ModelState
二、数据注解 - Data Annotations
三、自定义数据注解
四、全局数据验证
五、单元测试
 

一、模型状态 - ModelState

  我理解的ModelState是微软在ASP.NET MVC中提出的一种新机制,它主要实现以下几个功能:

  1. 保存客户端传过来的数据,如果验证不通过,把数据返回到客户端,这样可以保存用户输入,不需要重新输入。

  2. 验证数据,以及保存数据对应的错误信息。

  3. 微软的一种DRY(Don't Repeat Yourself)设计,通过ModelState可以做服务端验证,同时可以配合jquery validation生成前端数据验证。

 

  但是在Web API里面,ModelState的主要功能就只剩下第2点了。

  需要注意的是,ModelState一般只做输入验证,一些其他的业务验证还有要在特定的地方进行处理。

 

二、数据注解 - Data Annotations

  数据注解可以理解为验证数据的逻辑或方法,微软本身有提供一批数据注解,当然我们也可以自定义数据注解,以下是微软提供的常见的数据注解:

  1. Required - 非空验证。

  当一个输入是null时会引发一个验证错误。

  当属性类型是string的时候,如果设置了AllowEmptyStrings = false(默认为false),那么输入空字符串或者空格,也会引发一个验证错误。

    [Required]
    public string Name { get; set; }

    [Required(AllowEmptyStrings = true)]
    public string Exchange { get; set; }

 

  2. StringLength - 长度验证。

  当输入大于指定最大长度,或者小于最大指定长度时,会引发一个验证错误。 

    [StringLength(100)]
    public string Symbol { get; set; }

    [StringLength(100, MinimumLength = 10)]
    public string Name { get; set; }

 

  3. RegularExpression - 正则表达式验证。

  当输入内容不满足指定的正则表达式时,会引发一个验证错误。

  注:在.NET Framework 4.6.1添加了一个MatchTimeoutInMilliseconds属性,用来设定正则表达时验证时长。如超时,则抛出RegexMatchTimeoutException异常。

    [RegularExpression("your expression")]
    public string Symbol { get; set; }

 

  4. Range - 值范围验证

  当输入的值小于最小值或者大于最大值时,会引发一个验证错误,这里要求验证字段的类型需要实现IComparable接口。

    [Range(10, 100)]
    public double OpenPrice { get; set; }

    [Range(typeof(double), "10", "100")]
    public double ClosePrice { get; set; }

 

  5. Compare - 对比验证

  确保对象两个属性拥有相同的值。如果两个值不同,会引发一个验证错误。

    public string Name { get; set; }

    [Compare("Name")]
    public string ConfirmName { get; set; }

  

  6. Remote - 远程调用验证

  Remote可以利用服务端回调函数执行客户端的验证逻辑。

  注:该数据注解是ASP.NET MVC特有的注解,在Web Api中无此注解。

    [Remote("CheckName", "Account"]
    public string UserName{ get; set; }

    public class AccountController: Controller
    {
        public JsonResult CheckName(string name)
        {
             return Json(true);       
        }
    }

 

三、自定义数据注解

  如果觉得微软提供的数据注解不够用,也可以自己写数据注解,只需要继承ValidationAttribute,并复写IsValid方法。

  下面是一个来自《ASP.NET MVC 5高级编程》的一个例子MaxWordsAttribute,用于限制属性的单词个数。

    public class MaxWordsAttribute : ValidationAttribute
    {
        private readonly int _maxWords;

        public MaxWordsAttribute(int maxWords)
        {
            _maxWords = maxWords;
        }

        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            if (value != null)
            {
                var valueAsString = value.ToString();

                if (valueAsString.Split(' ').Length > _maxWords)
                {
                    return new ValidationResult("Too many words!");
                }
            }

            return ValidationResult.Success;
        }
    }
View Code

相关文章:

  • 2022-02-26
  • 2021-07-16
  • 2021-05-24
  • 2022-12-23
  • 2021-07-23
猜你喜欢
  • 2022-02-06
  • 2021-06-21
  • 2021-10-20
  • 2021-07-31
  • 2021-12-25
相关资源
相似解决方案