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 EBuy.Website.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 = "姓名")] [Required(ErrorMessage = "姓名是必须的!")] [MaxLength(4, ErrorMessage = "太长了")] 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() 即可。