驗證與資料註解驗證器 (C#)

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 檔案中註冊 DataAnnotations 模型系結器。 將下列程式程式碼新增至 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 命名空間包含下列驗證程式屬性:

  • 範圍 – 可讓您驗證屬性值是否落在指定的值範圍之間。
  • RegularExpression – 可讓您驗證屬性的值是否符合指定的正則運算式模式。
  • 必要 – 可讓您將屬性標示為必要。
  • 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 屬性可讓您在錯誤訊息中顯示內容時修改屬性的名稱。 您可以顯示錯誤訊息「需要 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 中建立檢視,方法是以滑鼠右鍵按一下 [建立] () 動作,然後選取 [ 新增檢視] 功能表選項。 建立具有 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 Designer會產生模型類別,所以下次您在Designer進行任何變更時,將會覆寫您對模型類別所做的任何變更。

如果您想要搭配 Entity Framework 所產生的類別使用驗證程式,則需要建立中繼資料類別。 您可以將驗證程式套用至中繼資料類別,而不是將驗證程式套用至實體類別。

例如,假設您已使用 Entity Framework 建立 Movie 類別 (請參閱 圖 5) 。 此外,想像您想要讓電影標題和 Director 屬性成為必要屬性。 在此情況下,您可以在 清單 4中建立部分類別和中繼資料類別。

電影類別的影像

圖 5:Entity Framework 所產生的電影類別

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 中的 Entity Framework 所產生的部分類別。Designer.vb 檔案。

目前,.NET Framework 不支援部分屬性。 因此,無法將驗證程式屬性套用至 DataModel 中定義的 Movie 類別屬性。Designer.vb 檔案,方法是將驗證程式屬性套用至清單 4檔案中定義之 Movie 類別的屬性。

請注意,Movie 部分類別是以指向 MovieMetaData 類別的 MetadataType 屬性裝飾。 MovieMetaData 類別包含 Movie 類別屬性的 Proxy 屬性。

驗證程式屬性會套用至 MovieMetaData 類別的屬性。 Title、Director 和 DateReleased 屬性全都標示為必要屬性。 Director 屬性必須指派包含少於 5 個字元的字串。 最後,DisplayName 屬性會套用至 DateReleased 屬性,以顯示類似「需要日期發列欄位」的錯誤訊息,而不是「需要 DateReleased 欄位」錯誤。

注意

請注意,MovieMetaData 類別中的 Proxy 屬性不需要代表與 Movie 類別中對應屬性相同的類型。 例如,Director 屬性是 Movie 類別中的字串屬性,以及 MovieMetaData 類別中的物件屬性。

圖 6中的頁面說明當您輸入電影屬性不正確值時所傳回的錯誤訊息。

無效電影值的錯誤訊息影像

圖 6:搭配 Entity Framework 使用驗證程式 (按一下即可檢視完整大小的映射)

總結

在本教學課程中,您已瞭解如何利用資料批註模型系結器,在 ASP.NET MVC 應用程式中執行驗證。 您已瞭解如何使用不同類型的驗證程式屬性,例如 Required 和 StringLength 屬性。 您也已瞭解如何在使用 Microsoft Entity Framework 時使用這些屬性。