ASP.NET MVC 驗證方式(1)
實現一個簡單的驗證(C#)
本部分主要目的是說明如何在ASP.NET MVC應用程序中實現驗證。例如,將了解如何驗證一個表單提交時必填內容的合法性。了解如何應用model state和驗證相關的HTML helpers。
理解Model State
你使用model state,更準確點說是使用model state 字典去表示驗證錯誤。比如,列表一中的Create()方法,在產品類保存入庫之前去驗證產品類的屬性。
把驗證和數據邏輯加到控制類中是違反編程方法的,控制類中應該僅包含程序的流程邏輯。此處是為了便于說明才這樣寫的。
列表1---Controllers\ProductController.cs

// POST: /Product/Create
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Exclude="Id")] Product productToCreate)
{
// Validation logic
if (productToCreate.Name.Trim().Length == 0)
ModelState.AddModelError("Name", "Name is required.");
if (productToCreate.Description.Trim().Length == 0)
ModelState.AddModelError("Description", "Description is required.");
if (productToCreate.UnitsInStock < 0)
ModelState.AddModelError("UnitsInStock", "Units in stock cannot be less than zero.");
if (!ModelState.IsValid)
return View();
// Database logic
try
{
_entities.AddToProductSet(productToCreate);
_entities.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return View();
}
}
在列表一中,產品的名稱,簡介,單價等屬性都被驗證。如果任何一個屬性的驗證失敗,相應的錯誤就會被加到model state字典。
如果在mode state中有任何一個錯誤,ModelState.IsValid屬性都返回的是false。在這種情況下,創建一個新產品的HTML 表單將會再次被顯示。否則,如果沒有任何錯誤,新產品就被加到數據庫。
使用Helpers驗證
ASP.NET MVC 包含兩個驗證Helper:Html.ValidationMessage()和Html.ValidationSummary()。使用這兩個方法在視圖類中去顯示錯誤信息。
在ASP.NET MVC框架自動產生的視圖中使用Html.ValidationMessage()和Html.ValidationSummary()。按照如下步驟產生Create視圖:
1. 在產品控制類右鍵單擊Create()方法,選擇Add View選項(如圖一)。
2. 在Add view對話框中,選中Create a strongly-typed view (如圖2)。
3. 從View data class下拉列表中,選擇Product類。
4. 從view content下拉列表中,選擇Create.
5. 單擊add按鈕。
確保在添加視圖之前重新生成解決方案,否則,在View data class下拉列表框中不會出現類的列表。
圖1:
圖2:
在完成這些步驟之后,得到列表二的Create視圖。
列表2---views\Product\Create.aspx

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
<title>Create</title>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Create</h2>
<%= Html.ValidationSummary() %>
<% using (Html.BeginForm()) {%>
<fieldset>
<legend>Fields</legend>
<p>
<label for="Name">Name:</label>
<%= Html.TextBox("Name") %>
<%= Html.ValidationMessage("Name", "*") %>
</p>
<p>
<label for="Description">Description:</label>
<%= Html.TextBox("Description") %>
<%= Html.ValidationMessage("Description", "*") %>
</p>
<p>
<label for="Price">Price:</label>
<%= Html.TextBox("Price") %>
<%= Html.ValidationMessage("Price", "*") %>
</p>
<p>
<label for="UnitsInStock">UnitsInStock:</label>
<%= Html.TextBox("UnitsInStock") %>
<%= Html.ValidationMessage("UnitsInStock", "*") %>
</p>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
<% } %>
<div>
<%=Html.ActionLink("Back to List", "Index") %>
</div>
</asp:Content>
在列表2中,Html.ValidationSummary()被HTML表單自動調用。它被用來去顯示一組驗證錯誤信息。它顯示的一個具有圓點標記的錯誤信息列表。
Html.ValidationSummary()被Html表單的對應部分調用。它用來在對應表單項的右邊顯示一個錯誤信息,在列表2中的情況,如果有一個錯誤它就會顯示*號。
圖3中,當表單中對應項為空或值無效時驗證不過,提示的信息。
驗證錯誤出現的樣式是可以修改的。
有三個樣式表類用來控制驗證錯誤信息的樣式:
1.Input-validation-err
2.Field-validation-error
3.Validation-summary-errors
可以通過修改Content文件夾下的Site.css文件來修改驗證錯誤的樣式。
HtmlHelper類包含了只讀靜態屬性,ValidationInputCssClassName, ValidationFieldCssClassName, and ValidationSummaryCssClassName。
預定義綁定驗證和已綁定驗證
如果你提交這個表單去創建一個新產品,輸入一個無效字段,和空字段,這時你將會得到如圖4所示的驗證信息。這些錯誤信息是從哪里來的?
圖4:
實際上驗證信息有兩種類型--在表單字段被綁定到類之前和之后產生的錯誤信息。也就是,預綁定驗證錯誤和已綁定驗證錯誤。
在列表1中的Product控制器的Create()方法接受一個產品類的實列。如下所示:
Create表單中的字段值是通過model binder綁定到productToCreate類的。當它不能把表段字段的值綁定到表單屬性的時候,它就會自動的把一個錯誤信息加到model state中。
默認的model binder不能夠把字符串“apple“綁定到產品類的價格屬性上。不能把一個字符綁定到數值型屬性上。因此,model biner把一個錯誤信息加到了model state.
默認的model binder也不能把一個null值綁定到一個不接受null值的屬性。
如果想要自定義一些預綁定錯誤信息,這時需要為這些信息創建資源。
總結:
本部分描述了一個基本固定的ASP.NET MVC的驗證方式。了解了如何使用model state和HTML helper。也討論了預定義綁定和已綁定驗證的區別。在以后部分將討論把驗證代碼從控制部分轉移到model部分。