ASP.NET mvc的最好的优势之一就是支持Model验证,这个特性很方便你能够选择在定义Model的时候在字段中采用特性进行注解约定,也能够在代码中本身进行手动验证。下面就来细说一下ASP.NET MVC Model验证多种方式的实现。css
首先,咱们定义一个要用到的一个Model类,Appointment.cs:html
1 using System; 2 using System.ComponentModel.DataAnnotations; 3 4 namespace ModelValidation.Models { 5 public class Appointment { 6 7 public string ClientName { get; set; } 8 9 [DataType(DataType.Date)] 10 public DateTime Date { get; set; } 11 12 public bool TermsAccepted { get; set; } 13 } 14 }
上面Appointment的字段Date类型定义为日期类型,并用了System.ComponentModel.DataAnnotations命名空间来注解Model的字段为日期类型,若是传入不合法的日期Model就会验证不合法。正则表达式
再在Site.css中加入下面的样式用来标注错误的输入项:数组
1 .input-validation-error { 2 border: 1px solid #f00; 3 background-color: #fee; 4 }
而后,建立一个视图,MakeBooking.cshtml用来录入信息:mvc
1 @model ModelValidation.Models.Appointment 2 @{ 3 ViewBag.Title = "Make A Booking"; 4 } 5 <h4>Book an Appointment</h4> 6 7 @using (Html.BeginForm()) { 8 <p>Your name: @Html.EditorFor(m => m.ClientName)</p> 9 <p>Appointment Date: @Html.EditorFor(m => m.Date)</p> 10 <p>@Html.EditorFor(m => m.TermsAccepted) I accept the terms & conditions</p> 11 <input type="submit" value="Make Booking" /> 12 }
最后,在HomeController中加入下面两个Action:app
public ViewResult MakeBooking() { return View(); } [HttpPost] public ViewResult MakeBooking(Appointment appt) { if (ModelState.IsValid) { return View("Completed", appt); } else { return View(); } }
咱们查看/Home/MakeBooking会有下图要效果:ui
这时咱们看到Appointment Date输入框为红色的,表示输入不合法。看看这个input要样式class为:”input-validation-error text-box single-line“,而刚开始的时候为:”text-box single-line“正好多了一个”input-validation-error“,这也是刚开始咱们为何要定义一个类名为”input-validation-error“的样式的缘由。换句话说,默认状况下当MVC的Model字段验证不经过的时候就会在输入的页面输入项加上一个css类”input-validation-error“。spa
上面咱们演示了一个采用[DataType(DataType.Date)]来约定字段必须为Date类型,DataType为枚举类型,你能够选择其中的任意类型来约定你的Model字段。以下图:code
其实System.ComponentModel.DataAnnotations还为咱们提供了其它不少验证规则。比较经常使用的有:orm
[Required]:必填字段
[RegularExpression("xx"):正则表达式
这些都是System.ComponentModel.DataAnnotations命名空间下定义好的类,下面例举出用于Model验证的经常使用的类:
除了上面结合Model定义时System.ComponentModel.DataAnnotations下的类来约定Model验证规则这外,咱们还能够在程序中手动验证显式手动验证一个MVC的Model是否合法。下面咱们把Appointment以前加的DataAnnotations都去掉,代码最终以下:
1 public class Appointment 2 { 3 public string ClientName { get; set; } 4 5 public DateTime Date { get; set; } 6 7 public bool TermsAccepted { get; set; } 8 }
这时,咱们把接受输入的Action MakeBooking改为手动判断Model的字段是否合法:
1 [HttpPost] 2 public ViewResult MakeBooking(Appointment appt) 3 { 4 5 if (string.IsNullOrEmpty(appt.ClientName)) 6 { 7 ModelState.AddModelError("ClientName", "Please enter your name"); 8 } 9 10 if (ModelState.IsValidField("Date") && DateTime.Now > appt.Date) 11 { 12 ModelState.AddModelError("Date", "Please enter a date in the future"); 13 } 14 15 if (!appt.TermsAccepted) 16 { 17 ModelState.AddModelError("TermsAccepted", "You must accept the terms"); 18 } 19 20 if (ModelState.IsValid) 21 { 22 return View("Completed", appt); 23 } 24 else 25 { 26 return View(); 27 } 28 }
上面能够看到咱们在Action方法的内部依次手动进行验证相应的每一个字段的值是否知足要求,若是验证不经过就调用ModelState.AddModelError加入Model验证错误信息,这个AddModelError有两个参数,第一个为被验证的字段,第二个为要显示错误信息提示的文本。验证完了每一个字段以后调用ModelState.IsValid来总的判断Model的验证以后的结果是否合法。只要有一个字段验证没经过或者咱们调用了ModelState.AddModelError,ModelState.IsValid都会返回false。
咱们在上面的例子中,当验证不经过的时候咱们除了把输入框变红以外,是没有显示文本提示的。其实要在页面显示MVC的Model验证错误信息也很简单,只须要在视图中调用:@Html.ValidationSummary() 就能够了。
@model MVCModelBindingDemo.Models.Appointment @{ ViewBag.Title = "Make A Booking"; } <h4>Book an Appointment</h4> @using (Html.BeginForm()) { @Html.ValidationSummary() <p>Your name: @Html.EditorFor(m => m.ClientName)</p> <p>Appointment Date: @Html.EditorFor(m => m.Date)</p> <p>@Html.EditorFor(m => m.TermsAccepted) I accept the terms & conditions</p> <input type="submit" value="Make Booking" /> }
一样咱们在/Home/MakeBooking页面中什么都不录入,直接提交将会出现下图中的结果:
咱们查看@Html.ValidationSummary()生成的html源码以下图:
生成的验证错误信息用一个样式名为"validation-summary-errors"的div,错误项是用ul 和li 列出。
下面来介绍一下ValidationSummary()方法的几种参数重载版本:
除了采用上面汇总的形式显示MVC的Model验证错误信息,咱们还能够分每一个属性(Property-Level )显示验证信息。Property-Level验证信息是咱们经过ModelState.AddModelError来注册的验证信息。下面咱们改一下/Home/MakeBooking视图文件,改后的内容以下:
1 @model MVCModelBindingDemo.Models.Appointment 2 @{ 3 ViewBag.Title = "Make A Booking"; 4 } 5 <h4>Book an Appointment</h4> 6 7 @using (Html.BeginForm()) 8 { 9 <p>@Html.ValidationMessageFor(m => m.ClientName)</p> 10 <p>Your name: @Html.EditorFor(m => m.ClientName)</p> 11 <p>@Html.ValidationMessageFor(m => m.Date)</p> 12 <p>Appointment Date: @Html.EditorFor(m => m.Date)</p> 13 <p>@Html.ValidationMessageFor(m => m.TermsAccepted)</p> 14 <p>@Html.EditorFor(m => m.TermsAccepted) I accept the terms & conditions</p> 15 <input type="submit" value="Make Booking" /> 16 }
能够看到咱们把@Html.ValidationSummary()去掉了,而后在每一个字段后面加入了@Html.ValidationMessageFor对应字段的验证信息。验证效果以下图: