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("验证失败");
}
}
在参数很多的情况下使用下面的封装的方法:
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();
}
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; }
}
验证Attribute上都有ErrorMessage属性,用来自定义报错信息。ErrorMessage中可以用{0}占位符作为属性名的占位。 示例代码:
[Required(ErrorMessage="不能为空")]
public int Age { get; set; }
数据验证+Html辅助类高级控件可以实现很多简化的开发,连客户端+服务器端校验都自动实现了,但是有点太“WebForm”了,因此这里先学习核心原理,避免晕菜。
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开头";
}
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;
}
}
}
}
}
3,还可以让Model类实现IValidatableObject接口,用的比较少