詳解ASP.NET MVC Model驗證

ASP.NET mvc的最好的優勢之一就是支持Model驗證,這個特性很方便你能夠選擇在定義Model的時候在字段中採用特性進行註解約定,也能夠在代碼中本身進行手動驗證。下面就來細說一下ASP.NET MVC Model驗證多種方式的實現。css

1、瞭解什麼是ASP.NET MVC Model驗證

首先,咱們定義一個要用到的一個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

2、採用System.ComponentModel.DataAnnotations註解Model的字段

上面咱們演示了一個採用[DataType(DataType.Date)]來約定字段必須爲Date類型,DataType爲枚舉類型,你能夠選擇其中的任意類型來約定你的Model字段。以下圖:code

其實System.ComponentModel.DataAnnotations還爲咱們提供了其它不少驗證規則。比較經常使用的有:orm

[Required]:必填字段

[RegularExpression("xx"):正則表達式

這些都是System.ComponentModel.DataAnnotations命名空間下定義好的類,下面例舉出用於Model驗證的經常使用的類:

  • CompareAttribute             提供比較兩個屬性的屬性。 
  • CreditCardAttribute         指定數據字段值是信用卡號碼。 
  • CustomValidationAttribute     指定自定義的驗證方法來驗證屬性或類的實例。 
  • DataTypeAttribute             指定要與數據字段關聯的附加類型的名稱。 
  • DisplayAttribute             提供一個通用特性,使您能夠爲實體分部類的類型和成員指定可本地化的字符串。 
  • EmailAddressAttribute         確認一電子郵件地址。 
  • MaxLengthAttribute             指定屬性中容許的數組或字符串數據的最大長度。 
  • MinLengthAttribute             指定屬性中容許的數組或字符串數據的最小長度。 
  • PhoneAttribute                 使用電話號碼的正則表達式,指定數據字段值是一個格式正確的電話號碼。 
  • RangeAttribute                 指定數據字段值的數值範圍約束。 
  • RegularExpressionAttribute     指定 ASP.NET 動態數據中的數據字段值必須與指定的正則表達式匹配。 
  • RequiredAttribute             指定須要數據字段值。 
  • UrlAttribute                 提供 URL 驗證。

3、顯式手動驗證一個MVC的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。

 

4、在頁面顯示MVC的Model驗證錯誤信息

4.一、採用彙總的形式顯示MVC的Model驗證錯誤信息

咱們在上面的例子中,當驗證不經過的時候咱們除了把輸入框變紅以外,是沒有顯示文本提示的。其實要在頁面顯示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()方法的幾種參數重載版本:

  • Html.ValidationSummary():生成輸出全部驗證錯誤信息。
  • Html.ValidationSummary(bool):若是bool爲true,只顯示model-level錯誤信息,也就是經過ModelState.AddModelError來註冊的驗證信息。若是bool爲false,生成輸出全部驗證錯誤信息。
  • Html.ValidationSummary(string) :在生成輸出全部驗證錯誤信息以前顯示一段文字
    Html.ValidationSummary(bool, string):在生成輸出驗證錯誤信息以前顯示一段文字,一樣bool爲true,只顯示model-level錯誤信息。

 

4.二、分每一個屬性(Property-Level )顯示驗證信息

除了採用上面彙總的形式顯示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對應字段的驗證信息。驗證效果以下圖:

 

相關文章
相關標籤/搜索