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 接口,用的比较少,不讲了。

浙公网安备 33010602011771号