驗證與資料註解驗證器 (VB)

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 Sub Application_Start()
    RegisterRoutes(RouteTable.Routes)
    ModelBinders.Binders.DefaultBinder = New Microsoft.Web.Mvc.DataAnnotations.DataAnnotationsModelBinder()
End Sub

這一行程式碼會將 DataAnnotationsModelBinder 註冊為整個 ASP.NET MVC 應用程式的預設模型系結器。

使用資料批註驗證程式屬性

當您使用資料批註模型系結器時,您會使用驗證程式屬性來執行驗證。 System.ComponentModel.DataAnnotations 命名空間包含下列驗證程式屬性:

  • 範圍 – 可讓您驗證屬性值是否落在指定的值範圍之間。
  • RegularExpression – 可讓您驗證屬性值是否符合指定的正則運算式模式。
  • 必要 – 可讓您將屬性標示為必要。
  • StringLength – 可讓您指定字串屬性的最大長度。
  • 驗證 – 所有驗證程式屬性的基類。

注意

如果您的驗證需求不受任何標準驗證程式滿足,則您一律可以選擇從基底驗證屬性繼承新的驗證程式屬性來建立自訂驗證程式屬性。

清單 1中的 Product 類別說明如何使用這些驗證程式屬性。 Name、Description 和 UnitPrice 屬性會標示為必要。 Name 屬性必須具有小於 10 個字元的字串長度。 最後,UnitPrice 屬性必須符合代表貨幣金額的正則運算式模式。

Imports System.ComponentModel
Imports System.ComponentModel.DataAnnotations

Public Class Product

    Private _id As Integer
    Private _name As String
    Private _description As String
    Private _unitPrice As Decimal

    Public Property Id() As Integer
        Get
            Return _id
        End Get
        Set(ByVal value As Integer)
            _id = value
        End Set
    End Property

     _
    Public Property Name() As String
        Get
            Return _name
        End Get
        Set(ByVal value As String)
            _name = value
        End Set
    End Property

     _
    Public Property Description() As String
        Get
            Return _description
        End Get
        Set(ByVal value As String)
            _description = value
        End Set
    End Property

     _
    Public Property UnitPrice() As Decimal
        Get
            Return _unitPrice
        End Get
        Set(ByVal value As Decimal)
            _unitPrice = value
        End Set
    End Property

End Class

清單 1:Models\Product.vb

Product 類別說明如何使用一個額外的屬性:DisplayName 屬性。 DisplayName 屬性可讓您在錯誤訊息中顯示內容時修改屬性的名稱。 您可以顯示錯誤訊息「需要 UnitPrice 欄位」,而不是顯示錯誤訊息「需要價格欄位」。

注意

如果您想要完全自訂驗證程式所顯示的錯誤訊息,您可以將自訂錯誤訊息指派給驗證程式的 ErrorMessage 屬性,如下所示: <Required(ErrorMessage:="This field needs a value!")>

您可以在 清單 1 中使用 Product 類別搭配 清單 2中的 Create () 控制器動作。 當模型狀態包含任何錯誤時,此控制器動作會重新顯示 [建立] 檢視。

Public Class ProductController
    Inherits System.Web.Mvc.Controller

    '
    ' GET: /Product/Create

    Function Create() As ActionResult
        Return View()
    End Function

    '
    ' POST: /Product/Create

     _
    Function Create( ByVal productToCreate As Product) As ActionResult

        If Not ModelState.IsValid Then
            Return View()
        End If

        Return RedirectToAction("Index")

    End Function

End Class

清單 2:Controllers\ProductController.vb

最後,您可以在 清單 3 中建立檢視,方法是以滑鼠右鍵按一下 [建立] () 動作,然後選取 [ 新增檢視] 功能表選項。 建立具有 Product 類別做為模型類別的強型別檢視。 從檢視內容下拉式清單中選取 [ 建立 ], (請參閱 圖 2) 。

新增檢視對話方塊的影像

圖 2:新增建立檢視

<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage(Of MvcApplication1.Product)" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Create
</asp:Content>

<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">UnitPrice:</label>
                <%= Html.TextBox("UnitPrice") %>
                <%= Html.ValidationMessage("UnitPrice", "*") %>
            </p>
            <p>
                <input type="submit" value="Create" />
            </p>
        </fieldset>

    <% End Using %>

    <div>
        <%=Html.ActionLink("Back to List", "Index") %>
    </div>

</asp:Content>

清單 3:Views\Product\Create.aspx

注意

從 [ 新增檢視 ] 功能表選項所產生的 [建立表單] 中移除 [識別碼] 欄位。 由於 [識別碼] 欄位對應至 [識別] 資料行,因此您不想允許使用者輸入此欄位的值。

如果您提交表單來建立產品,而且您未輸入必要欄位的值, 則會顯示圖 3 中的驗證錯誤訊息。

所有驗證錯誤訊息的影像

圖 3:遺漏必要欄位

如果您輸入不正確貨幣金額, 則會顯示圖 4 中的錯誤訊息。

無效貨幣錯誤訊息的影像

圖 4:不正確貨幣金額

搭配 Entity Framework 使用資料批註驗證程式

如果您使用 Microsoft Entity Framework 來產生資料模型類別,則您無法將驗證程式屬性直接套用至您的類別。 因為 Entity Framework Designer產生模型類別,所以下次您在Designer進行任何變更時,將會覆寫您對模型類別所做的任何變更。

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

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

電影類別的影像

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

Imports System.ComponentModel
Imports System.ComponentModel.DataAnnotations

 _
Partial Public Class Movie
End Class

Public Class MovieMetaData

    Private _title As Object
    Private _director As Object
    Private _dateReleased As Object

     _
    Public Property Title() As Object
        Get
            Return _title
        End Get
        Set(ByVal value As Object)
            _title = value
        End Set
    End Property

     _
    Public Property Director() As Object
        Get
            Return _director
        End Get
        Set(ByVal value As Object)
            _director = value
        End Set
    End Property

     _
    Public Property DateReleased() As Object
        Get
            Return _dateReleased
        End Get
        Set(ByVal value As Object)
            _dateReleased = value
        End Set
    End Property
End Class

清單 4:Models\Movie.vb

清單 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中的頁面說明當您為 Movie 屬性輸入無效值時所傳回的錯誤訊息。

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

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

總結

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