由 Microsoft 提供
利用資料註解模型繫結器在 ASP.NET MVC 應用程式中執行驗證。 了解如何使用不同類型的驗證程式屬性,並在 Microsoft Entity Framework 中使用它們。
在本教學課程中,您將了解如何使用資料註解驗證程式在 ASP.NET MVC 應用程式中執行驗證。 使用資料註解驗證程式的優點是,只要將一或多個屬性,例如 Required 或 StringLength 屬性新增至類別屬性,即可執行驗證。
請務必了解資料註解模型繫結器不是 Microsoft ASP.NET MVC 架構的正式部分。 雖然資料註解模型繫結器是由 Microsoft ASP.NET MVC 團隊所建立,但 Microsoft 不提供本教學課程中所述及使用之資料註解模型繫結器的正式產品支援。
使用資料註解模型繫結器
若要在 ASP.NET MVC 應用程式中使用資料註解模型繫結器,必須先將參考新增至 Microsoft.Web.Mvc.DataAnnotations.dll 組件和 System.ComponentModel.DataAnnotations.dll 組件。 選取功能表選項專案,新增參考。 接下來,按一下 [ 瀏覽] 索引標籤,並瀏覽至您下載資料註解模型繫結器範本的位置 (並解壓縮) (請參閱圖 1)。
圖 1:新增資料註解模型繫結器參考 (按一下以檢視完整大小的影像)
同時選取 Microsoft.Web.Mvc.DataAnnotations.dll 組件和 System.ComponentModel.DataAnnotations.dll 組件,然後按一下 [確定] 按鈕。
您無法一起使用 .NET Framework Service Pack 1 隨附的 System.ComponentModel.DataAnnotations.dll 組件和資料註解模型繫結器。 您必須使用下載的資料註解模型繫結器範例隨附的 System.ComponentModel.DataAnnotations.dll 組件版本。
最後,您必須在 Global.asax 檔案中註冊資料註解模型繫結器。 將下列程式碼行新增至 Application_Start() 事件處理常式,讓 Application_Start() 方法看起來像這樣:
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
ModelBinders.Binders.DefaultBinder = new Microsoft.Web.Mvc.DataAnnotations.DataAnnotationsModelBinder();
}
此程式碼行會將 ataAnnotationsModelBinder 註冊為整個 ASP.NET MVC 應用程式的預設模型繫結器。
使用資料註解驗證程式屬性
當您使用資料註解模型繫結器時,可以使用驗證程式屬性來執行驗證。 System.ComponentModel.DataAnnotations 命名空間包含下列驗證程式屬性:
- Range – 可讓您驗證屬性值是否落在指定的值範圍之間。
- RegularExpression – 使您能夠驗證屬性的值是否與指定的規則運算式模式匹配。
- Required – 讓您將屬性標示為必要。
- StringLength – 讓您指定字串屬性的最大長度。
- Validation – 所有驗證程式屬性的基底類別。
注意
如果任何標準驗證程式都無法滿足您的驗證需求,那麼您始終可以選擇透過從基本 [驗證] 屬性繼承新的驗證程式屬性來建立自訂驗證程式屬性。
清單 1 中的 Product 類別說明如何使用這些驗證程式屬性。 Name、Description 和 UnitPrice 屬性會標示為必要。 Name 屬性的字串長度必須小於 10 個字元。 最後,UnitPrice 屬性必須符合代表貨幣金額的規則運算式模式。
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace MvcApplication1.Models
{
public class Product
{
public int Id { get; set; }
[Required]
[StringLength(10)]
public string Name { get; set; }
[Required]
public string Description { get; set; }
[DisplayName("Price")]
[RegularExpression(@"^\$?\d+(\.(\d{2}))?$")]
public decimal UnitPrice { get; set; }
}
}
清單 1:Models\Product.cs
Product 類別說明如何使用一個額外的屬性:DisplayName 屬性。 DisplayName 屬性可讓您在錯誤訊息中顯示屬性時修改屬性的名稱。 您可以顯示錯誤訊息「Price 欄位是必要的」,而不是顯示錯誤訊息「UnitPrice 欄位是必要的」。
注意
如果您想要完全自訂驗證程式所顯示的錯誤訊息,可以將自訂錯誤訊息指派給驗證程式的 ErrorMessage 屬性,如下所示:<Required(ErrorMessage:="This field needs a value!")>
您可以在清單 1 中使用 Product 類別搭配清單 2 中的 Create() 控制器動作。 當模型狀態包含任何錯誤時,此控制器動作會重新顯示 [建立] 檢視。
using System.Web.Mvc;
using MvcApplication1.Models;
namespace MvcApplication1.Controllers
{
public class ProductController : Controller
{
//
// GET: /Product/Create
public ActionResult Create()
{
return View();
}
//
// POST: /Product/Create
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Exclude="Id")]Product productToCreate)
{
if (!ModelState.IsValid)
return View();
// TODO: Add insert logic here
return RedirectToAction("Index");
}
}
}
清單 2:Controllers\ProductController.vb
最後,您可以在清單 3 中建立檢視,方法是以滑鼠右鍵按一下 Create() 動作,然後選功能表選項 [新增檢視]。 使用 Product 類別作為模型類別建立強型別檢視。 從檢視內容下拉式清單中選取 [建立] (請參閱 圖 2)。
圖 2:新增建立檢視
<%@ Page Title="" Language="C#" MasterPageFile="Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MvcApplication1.Models.Product>" %>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Create</h2>
<%= Html.ValidationSummary("Create was unsuccessful. Please correct the errors and try again.") %>
<% 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="UnitPrice">Price:</label>
<%= Html.TextBox("UnitPrice") %>
<%= Html.ValidationMessage("UnitPrice", "*") %>
</p>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
<% } %>
<div>
<%=Html.ActionLink("Back to List", "Index") %>
</div>
</asp:Content>
清單 3:Views\Product\Create.aspx
注意
從 [新增檢視] 功能表選項所產生的 [建立] 表單中移除識別碼欄位。 因為識別碼欄位對應至 [識別] 資料行,因此您不允許使用者輸入此欄位的值。
如果您提交建立 Product 的表單,而且未輸入必要欄位的值,則會顯示圖 3 中的驗證錯誤訊息。
圖 3:缺少必要欄位
如果您輸入無效的貨幣金額,則會顯示圖 4 中的錯誤訊息。
圖 4:貨幣金額無效
搭配 Entity Framework 使用資料註解驗證程式
如果您使用 Microsoft Entity Framework 來產生資料模型類別,則無法將驗證程式屬性直接套用至您的類別。 因為 Entity Framework 設計工具會產生模型類別,您在下次在設計工具中進行任何變更時,將會覆寫您對該模型類別所做的任何變更。
如果您想要搭配 Entity Framework 所產生的類別使用驗證程式,則需要建立中繼資料類別。 您將驗證程式套用至中繼資料類別,而不是套用至實際類別。
例如,假設您已使用 Entity Framework 建立 Movie 類別 (請參閱圖 5)。 此外,想像一下,您想要製作 Movie Title 和 Director 屬性所需的屬性。 在此案例下,您可以在清單 4 中建立部分類別和中繼資料類別。
圖 5:Entity Framework 所產生的 Movie 類別
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace MvcApplication1.Models
{
[MetadataType(typeof(MovieMetaData))]
public partial class Movie
{
}
public class MovieMetaData
{
[Required]
public object Title { get; set; }
[Required]
[StringLength(5)]
public object Director { get; set; }
[DisplayName("Date Released")]
[Required]
public object DateReleased { get; set; }
}
}
清單 4:Models\Movie.cs
清單 4 中的檔案包含兩個名為 Movie 和 MovieMetaData 的類別。 Movie 類別是部分類別。 它會對應至包含在 DataModel.Designer.vb 檔案中 Entity Framework 所產生的部分類別。
目前,.NET Framework 不支援部分屬性。 因此,無法透過將驗證程式屬性套用至清單 4 中檔案所定義的 Movie 類別的屬性,來將驗證程式屬性套用至 DataModel.Designer.vb 檔案中定義的 Movie 類別的屬性。
請注意,Movie 部分類別是以指向 MovieMetaData 類別的 MetadataType 屬性裝飾。 MovieMetaData 類別包含 Movie 類別屬性的 Proxy 屬性。
驗證程式屬性會套用至 MovieMetaData 類別的屬性。 Title、Director 和 DateReleased 屬性全都標示為必要屬性。 必須指派 5 個字元以下的字串給 Director 屬性。 最後,DisplayName 屬性會套用至 DateReleased 屬性,以顯示錯誤訊息,例如「日期發行欄位是必要的。」而不是錯誤「DateReleased 欄位是必要的。」
注意
請注意,MovieMetaData 類別中的 Proxy 屬性不需要表示與 Movie 類別中對應屬性相同的類型。 例如,Director 屬性是 Movie 類別中的字串屬性,也是 MovieMetaData 類別中的物件屬性。
圖 6 中的頁面說明當您為 Movie 屬性輸入無效值時所傳回的錯誤訊息。
圖 6:搭配 Entity Framework 使用驗證程式 (按一下以檢視完整大小的影像)
摘要
在本教學課程中,您已了解如何利用資料註解模型繫結器,在 ASP.NET MVC 應用程式中執行驗證。 您已了解如何使用不同類型的驗證程式屬性,例如 Required 和 StringLength 屬性。 您也已了解如何在使用 Microsoft Entity Framework 時使用這些屬性。





