ASP.NET MVC5中的Model验证
Model验证是ASP.NET MVC中的重要部分,它主要用于判断输入的数据类型及值是否符合我们设定的规则,这篇文章就介绍下ASP.NET MVC中Model验证的几种方式。
后台验证
DataAnnotation
DataAnnotation翻译过来是“数据注解”的意思,DataAnnotation命名空间中包含一些用于验证Model的特性,如:RequiredAttribute,CompareAttribute,DisplayAttribute等,我们在创建Model时,将相应的特性性标注到字段上即可实现数据验证。
创建Model
public class Person
{
[Display(Name = "姓名")]
[Required(ErrorMessage = "姓名是必须的!")]
public string Name { set; get; }
[Display(Name = "姓名")]
public int Age { set; get; }
}
View中的代码:
@model Models.Person
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
<h3 style="color:red;">
@Html.ValidationSummary()
</h3>
</div>
<div>
@using (Html.BeginForm("evaluate", "home", "Post"))
{
@Html.LabelFor(Model => Model.Name)
@Html.TextBoxFor(Model => Model.Name)
@Html.LabelFor(Model => Model.Age)
@Html.TextBoxFor(Model => Model.Age)
<input type="submit" value="提交" />
}
</div>
</body>
</html>
Controller中的代码:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult Evaluate(Person person)
{
if (ModelState.IsValid)
{
return Content("evaluate success!");
}
return View("Index", person);
}
}
运行程序:
注意,Age属性上并未标注RequiredAttribute,却依然提示Age字段必须,这是因为Age是int类型,int类型不能为null,对于不能为null的类型,ASP.NET MVC默认为是必须的。除此之外,ASP.NET MVC还会帮助我们进行数据类型的验证,如,若在年龄一栏输入非整数,那么验证将不会通过,且会提示数值不合法。
ValuationAttribute
除了使用DataAnnotation中预定义的一些特性进行数据验证外,我们还可以自定义验证特性。这里我们通过覆写DataAnnotation命名空间中ValudationAttribute类的IsValid方法来实现自定义验证。示例代码如下:
public class CheckAgeAttribute : ValidationAttribute
{
private int _minage;
public CheckAgeAttribute(int minAge)
{
_minage = minAge;
}
public override bool IsValid(object value)
{
if (value is int)
{
var age = value as int?;
if (age == null)
{
return false;
}
if (age < _minage)
{
return false;
}
return true;
}
return false;
}
public override string FormatErrorMessage(string name)
{
return base.FormatErrorMessage(name);
}
}
标注特性:
public class Person
{
[Display(Name = "姓名")]
public string Name { set; get; }
[Display(Name = "年龄")]
[CheckAge(18, ErrorMessage = "年纪太小!")]
public int Age { set; get; }
}
然后运行程序:
执行结果
IValidatableObject
通过实现IValidatableObject接口进行数据的验证,示例代码如下:
public class Person : IValidatableObject
{
[Display(Name = "姓名")]
public string Name { set; get; }
[Display(Name = "年龄")]
public int Age { set; get; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
Person person = validationContext.ObjectInstance as Person;
if (person == null)
{
yield break;
}
if (string.IsNullOrEmpty(person.Name))
{
yield return new ValidationResult("您贵姓?");
}
if (person.Age < 18)
{
yield return new ValidationResult("太年轻了!");
}
}
}
运行程序:
执行结果
IDataErrorInfo
实现IDataErrorInfo接口也可以进行数据的验证,示例代码如下:
public class Person : IDataErrorInfo
{
[Display(Name = "姓名")]
public string Name { set; get; }
[Display(Name = "年龄")]
public int Age { set; get; }
public string this[string columnName]
{
get
{
switch (columnName)
{
case "Name":
if (string.IsNullOrEmpty(Name))
{
return "雁过留声,人过留名";
}
return null;
case "Age":
if (Age < 18)
{
return "年纪尚轻!";
}
break;
}
return null;
}
}
public string Error
{
get
{
//若返回值不是""或null,则不管数据是否合法,则验证都不会通过
//并且会在数据验证成功后显示此处指定的错误信息
return "";
//return "出错啦!";
}
}
}
运行程序:
执行结果
前端验证
上述验证均是在服务器端进行的,除此之外我们也可以使用js在客户端进行数据的验证。除了我们自己手写js代码外,ASP.NET MVC也提供了前端验证方法,要启用ASP.NET MVC提供的前端验证方法需要在页面中引入三个js文件:
- jquery-1.10.2.min.js(也可以是其它版本的jQuery)
- jquery.validate.min.js
- jquery.validate.unobtrusive.min.js
然后在配置文件中开启客户端验证(默认是开启的):
<configuration>
<appSettings>
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>
</appSettings>
</configuration>
注意:若要使ASP.NET MVC提供的前端验证生效,需要对Model进行数据注解(DataAnnotation)。
引用文件之后,运行程序,然后查看页面源代码,可以看到form中的input标签中多出了data-val
属性以及其它的和数据注解相关的属性。
对于验证失败的信息,我们需要对用户进行相应的提醒。只需要在<form></form>中添加@Html.ValidationSummary()
即可。