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; } }