• 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接口,用的比较少

  • 相关阅读:
    Spring Boot整合OAuth2实现GitHub第三方登录
    Execution failed for task ‘:keyboard_utils:compileDebugKotlin‘.
    SpringCloud01
    Java牛客网社区项目——知识点&面试题
    ChatGPT创造力与创新探究
    探讨 volatile 关键字
    将 SAP Spartacus 作为 feature module 进行 Lazy Load 延迟加载时遇到的注入错误分析
    Matlab:合并不同的整数类型
    【Kafka专题】Kafka收发消息核心参数详解
    vite中将css,js文件归类至文件夹
  • 原文地址:https://blog.csdn.net/huan13479195089/article/details/127136737