asp.net mvc框架之数据验证

asp.net mvc会自动根据属性的类型进行基本的校验,比如如果属性是int类型,那么再提交非整数类型的数据的时候就会报错

注意:asp.net mvc并不是再请求验证失败的时候抛出异常,而是把决定权交给程序员,程序员需要决定如何处理数据校验失败。再Action中根据ModelState.IsValid判断是否验证通过。

public ActionResult Index(Models.Person model)
        {
            //ModelState.IsValid:数据验证
            if (ModelState.IsValid)
            {
                string result = "age=" + model.age;
                return Content(result);
            }
            else
            {
                string result = "非法数值";
                return Content(result);
            }
            
        }

虽然时候ModelState.IsValid能判断验证是否通过,如果没有通过,那么就会报错,通过下面的类就可以获取到错误信息了

public static class ValiHelper
    {
        public static string GetValidMsg(ModelStateDictionary modelState)
        {
            StringBuilder sb = new StringBuilder();
            foreach (var propName in modelState.Keys)
            {
                //modelState[propName].Errors是属性相关的错误消息
                if (modelState[propName].Errors.Count<=0)
                {
                    continue;
                }
                sb.Append("属性错误:").Append(propName).Append(":");
                //遍历每个错误消息(因为一个属性可能有多个错误消息)
                foreach (ModelError modelError in modelState[propName].Errors)
                {
                    sb.Append(modelError.ErrorMessage);
                }
                sb.AppendLine();
            }
            return sb.ToString();
        }
    }

方法调用

 

=============================================================================================================

数据验证Attribute

Attribute主要是定义在属性上面,类似于属性里面的get,set方法。

常用的Attribute验证

[Required] 代表必填项

[StringLength(100)] 代表字符串最大长度100

[StringLength(100,MinimumLength=10)] 代表长度介于10到100之间

[RegularExpression(@"aa(\d)+bb")] 代表正则表达式

[Range(10,20)] 代表数值的取值范围,对比于字符串长度

[Compare("Email")] 代表这个属性必须和Email属性值一致

[EmailAddress] 代表邮箱地址

[phone] 表示电话号码,规则有限制(不推荐使用)

如果在验证Attribute上使用ErrorMessage="自定义错误信息"属性,用来自定义报错信息。其中ErrorMessage中可以用{0}占位符作为属性名的占位。

public class ValiModel
    {
        [Required(ErrorMessage = "数据必须填写")]
        public int id { get; set; }
        [StringLength(10, MinimumLength = 5)]
        [Required]
        public string name { get; set; }
        public int age { get; set; }
    }

 

========================================================

自定义验证

方式一:

public class QQNumber:RegularExpressionAttribute
    {
        public QQNumber():base(@"^\d{5,10}$")
        {
            this.ErrorMessage = "字段{0}不是合法的qq号"; 
        }
    }

方式二:

 

public class CNPhoneNumAttribute:ValidationAttribute
    {
        public CNPhoneNumAttribute()
        {
            this.ErrorMessage = "电话号码必须是固话或者手机13,15,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"))
                    {
                        return true;
                    }
                    else
                    { 
                        this.ErrorMessage = "";
                        return false;
                    }
                }
                else if (s.Contains("-")) //固定电话
                {
                    string[] strs = s.Split('-');
                    if (strs[0].Length==3||strs[0].Length==4)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                    
                }
            }
            return false;
            
        }
    }

 

posted @ 2019-06-17 13:49  black娃  阅读(1165)  评论(0编辑  收藏  举报