ASP.NET MVC数据验证

1) asp.net mvc 会自动根据属性的类型进行基本的校验,比如如果属性是 int 类型的,那么 在提交非整数类型的数据的时候就会报错。
 
注意 ASP.net MVC 并不是在请求验证失败的时候抛异常,而是把决定权交给程序员,程 序员需要决定如何处理数据校验失败。在Action中根据ModelState.IsValid判断是否验证通过, 如果没有通过下面的方法拿到报错信息:
 

string errorMsg = WebMVCHelper.GetValidMsg(this.ModelState); 
 
public static string GetValidMsg(ModelStateDictionary modelState)// 有两个 ModelStateDictionary 类,别弄混乱了。要使用 System.Web.Mvc 下的 {     StringBuilder sb = new StringBuilder();     foreach(var key in modelState.Keys)     {                         if(modelState[key].Errors.Count<=0)         {             continue;         }         sb.Append("属性【").Append(key).Append("】错误:");         foreach (var modelError in modelState[key].Errors)         {             sb.AppendLine(modelError.ErrorMessage);         }     }                 return sb.ToString(); } 

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

a) [Required] 这个属性是必须的

b) [StringLength(100)],字符串最大长度 100;[StringLength(100,MinimumLength=10)] 长度要介于 10 到 100 之间

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

d) [Range(35,88)] 数值范围。 字 符 串 长 度 范 围 的 话 请 使 用 [StringLength(100,MinimumLength=10)]

e) [Compare("Email")]这个属性必须和 Email 属性值一样。

f) [EmailAddress] 要是邮箱地址

g) [Phone]电话号码,规则有限

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

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

 

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

 

11、自定义验证规则 ValidationAttribute 直接或者继承自 ValidationAttribute。 1)如果能用正则表达式校验的直接从 RegularExpressionAttribute 继承。

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

手机号的正则表达式:@"^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开头";         } 
 
 //注意,不要override  ValidationResult IsValid(object value, ValidationContext validationContext)         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;                     }                 }                 else if(s.Contains("-"))//固话                 {                     //010,021  0755  0531                     string[] strs = s.Split('-');                     if(strs[0].Length==3|| strs[0].Length==4)                     {                         return true;                     }                     else                     {                         return false;                     }                 }                 else                 {                     return false;                 }             }             else             {                 return false;             }         }     }

3)还可以让 Model 类实现 IValidatableObject 接口,用的比较少,不讲了。

posted @ 2017-03-16 12:08  双鱼小毅  阅读(125)  评论(0)    收藏  举报