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對應字段的驗證信息。驗證效果以下圖: