• ASP.NET MVC--数据验证


    数据验证

    1,asp.net mvc会自动根据属性的类型进行基本的校验,比如如果属性是int类型的,那么在提交非整数类型的数据的时候就会报错。
    注意
    ASP.net MVC并不是在请求验证失败的时候抛异常,而是把决定权交给程序员,程序员需要决定如何处理数据校验失败。

    在Action中根据ModelState.IsValid判断是否验证通过,如果没有通过下面的方法拿到报错信息
    示例代码:

    public ActionResult Index(IndexModel model)
    {
        if (ModelState.IsValid)
        {
            return Content("Age=" + model.Age);
        }
        else
        {
            return Content("验证失败");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在参数很多的情况下使用下面的封装的方法:

    public static string GetValidMsg(ModelStateDictionary modelState)
    {
        StringBuilder sb = new StringBuilder();
        foreach (var propName in modelState.Keys)
        {
            if (modelState[propName].Errors.Count <= 0)
            {
                continue;
            }
            sb.Append("属性【").Append(propName).Append("】错误:");
            foreach (var modelError in modelState[propName].Errors)
            {
                sb.AppendLine(modelError.ErrorMessage);
            }
        }
        return sb.ToString();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    Attribute

    ASP.Net MVC提供了在服务器端验证请求数据的能力。要把对应的Attribute标记到Model的属性上(标记到方法参数上很多地方不起作用)。

    常用验证Attribute:
    a) [Required]   这个属性是必须的
    b) [StringLength(100)],字符串最大长度100
    c) [RegularExpression(@“aa(\d)+bb”)]   正则表达式
    d) [Range(35,88)]  数值范围。字符串长度范围的话请使用[StringLength(100,MinimumLength=10)]
    e) [Compare(“Email”)]  这个属性必须和Email属性值一样。
    f) [EmailAddress]   要是邮箱地址
    g) [Phone]  电话号码,规则有限

    示例代码:

    public class IndexModel
    {
        [Required]
        public int Age { get; set; }
        public long Id { get; set; }
        public string Name { get; set; }
        [StringLength(11)]
        public string PhoneNum { get; set; }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    验证Attribute上都有ErrorMessage属性,用来自定义报错信息。ErrorMessage中可以用{0}占位符作为属性名的占位。 示例代码:

    [Required(ErrorMessage="不能为空")]
    public int Age { get; set; }    
    
    • 1
    • 2

    数据验证+Html辅助类高级控件可以实现很多简化的开发,连客户端+服务器端校验都自动实现了,但是有点太“WebForm”了,因此这里先学习核心原理,避免晕菜。

    自定义验证规则

    1,使用正则表达式的校验,直接从RegularExpressionAttribute继承 示例代码:

    public class QQNumberAttribute : RegularExpressionAttribute
    {
        public QQNumberAttribute() : base(@"^\d{5,10}$")//不要忘了^$
        {
            this.ErrorMessage = "{0}属性不是合法的QQ号,QQ号需要5-10位数字";
            //设定ErrorMessage的默认值。使用的人也可以覆盖这个值
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    手机号的正则表达式:@“^1(3[0-9]|4[57]|5[0-35-9]|7[01678]|8[0-9])\d{8}$”

    2 直接继承自ValidationAttribute,重写IsValid方法 比如校验中国电话号码合法性

    public class CNPhoneNumAttribute : ValidationAttribute
    {
        public CNPhoneNumAttribute()
        {
            this.ErrorMessage = "电话号码必须是固话或者手机,固话要是3-4位区号开头,手机必须以13、15、18、17开头";
        }
        public override bool IsValid(object value)
        {
            if (value is string)
            {
                string s = (string)value;
                if (s.Length == 13)//手机号
                {
                    if (s.StartsWith("13") || s.StartsWith("15") || s.StartsWith("17") || s.StartsWith("18"))
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    3,还可以让Model类实现IValidatableObject接口,用的比较少

  • 相关阅读:
    C++标准模板(STL)- 类型支持 (数值极限,round_style,is_iec559,is_bounded)
    MYSQL 存储java.sql.Timestamp类型的数据时,mysql存储时间和java获取到的时间相差8小时
    element ui级联选择器数据处理
    设计模式---组合模式
    SpringAOP的实现机制(底层原理)、应用场景等详解
    Selenium 自动化测试详解
    基于SpringBoot+Vue架构的药物咨询平台
    EEPROM芯片选型对比表
    当分布 非正态分布时,能否使用Pearson Correlation?
    python pandas.DataFrame 直接写入Clickhouse
  • 原文地址:https://blog.csdn.net/huan13479195089/article/details/127136737