共用方式為


執行簡單的驗證 (VB)

作者:Stephen Walther

瞭解如何在 ASP.NET MVC 應用程式中執行驗證。 在本教學課程中,Stephen Walther 將為您介紹模型狀態和驗證 HTML 協助程式。

本教學課程的目標是說明如何在 ASP.NET MVC 應用程式中執行驗證。 例如,您將瞭解如何防止某人提交未包含必要欄位值的表單。 您將瞭解如何使用模型狀態和驗證 HTML 協助程式。

瞭解模型狀態

您可以使用模型狀態或更精確的模型狀態字典來表示驗證錯誤。 例如,清單 1 中的 Create () 巨集指令會在將 Product 類別新增至資料庫之前驗證 Product 類別的屬性。

我不建議您將驗證或資料庫邏輯新增至控制器。 控制器應該只包含與應用程式流程式控制制相關的邏輯。 我們採用一個快捷方式,讓事情保持簡單。

清單 1 - Controllers\ProductController.vb

'
' POST: /Product/Create

<AcceptVerbs(HttpVerbs.Post)> _
Public Function Create(<Bind(Exclude:="Id")> ByVal productToCreate As Product) As ActionResult
    ' Validation logic
    If productToCreate.Name.Trim().Length = 0 Then
    ModelState.AddModelError("Name", "Name is required.")
    End If
    If productToCreate.Description.Trim().Length = 0 Then
    ModelState.AddModelError("Description", "Description is required.")
    End If
    If productToCreate.UnitsInStock

在清單 1 中,會驗證 Product 類別的 Name、Description 和 UnitsInStock 屬性。 如果上述任一屬性失敗,驗證測試就會將錯誤新增至模型狀態字典, (Controller 類別的 ModelState 屬性所表示) 。

如果模型狀態有任何錯誤,ModelState.IsValid 屬性會傳回 false。 在此情況下,建立新產品的 HTML 表單會重新顯示。 否則,如果沒有驗證錯誤,則會將新的 Product 新增至資料庫。

使用驗證協助程式

ASP.NET MVC 架構包含兩個驗證協助程式:Html.ValidationMessage () 協助程式和 Html.ValidationSummary () 協助程式。 您可以在檢視中使用這兩個協助程式來顯示驗證錯誤訊息。

Html.ValidationMessage () 和 Html.ValidationSummary () 協助程式會用於 ASP.NET MVC Scaffolding 自動產生的建立和編輯檢視中。 請遵循下列步驟來產生 [建立] 檢視:

  1. 以滑鼠右鍵按一下產品控制器中的 [建立] () 巨集指令,然後選取功能表選項 [ 新增檢視 ] (請參閱圖 1) 。
  2. 在 [ 新增檢視 ] 對話方塊中,核取標示為 [建立強型別檢視 ] 的核取方塊, (請參閱圖 2) 。
  3. 從 [ 檢視資料類別 ] 下拉式清單中,選取 Product 類別。
  4. 從 [ 檢視內容 ] 下拉式清單中,選取 [建立]。
  5. 按一下 [新增] 按鈕。

新增檢視之前,請務必先建置應用程式。 否則,類別清單不會出現在 [ 檢視資料類別 ] 下拉式清單中。

程式碼編輯器中產品控制器點 c 檔案的螢幕擷取畫面,其中顯示以滑鼠右鍵按一下功能表,並醒目提示 [新增檢視] 功能表項目。

圖 01:新增檢視 (按一下以檢視完整大小的影像)

[新增檢視] 對話方塊的螢幕擷取畫面,其中顯示已填入 [建立強型別檢視] 核取方塊。

圖 02:建立強型別檢視 (按一下以檢視完整大小的影像)

完成這些步驟之後,您會在清單 2 中取得 [建立] 檢視。

清單 2 - Views\Product\Create.aspx

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

<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>

    <% End Using %>

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

</asp:Content>

在清單 2 中,會緊接在 HTML 表單上方呼叫 Html.ValidationSummary () 協助程式。 此協助程式可用來顯示驗證錯誤訊息的清單。 Html.ValidationSummary () 協助程式會在項目符號清單中呈現錯誤。

Html.ValidationMessage () 協助程式會在每個 HTML 表單欄位旁邊呼叫。 此協助程式用來在表單欄位旁邊顯示錯誤訊息。 在清單 2 的情況下,Html.ValidationMessage () 協助程式會在發生錯誤時顯示星號。

圖 3 中的頁面說明當表單提交遺漏欄位和無效值時,驗證協助程式所呈現的錯誤訊息。

Internet Explorer 視窗的螢幕擷取畫面,其中顯示 [建立] 檢視,其中包含填入無效值的欄位所產生的錯誤訊息。

圖 03:按一下 以檢視完整大小影像檢視 (提交的問題建立檢視)

請注意,HTML 輸入欄位的外觀也會在發生驗證錯誤時修改。 當 Html.TextBox () 協助程式呈現與 Html.TextBox () 協助程式所呈現之屬性相關聯的驗證錯誤時,Html.TextBox () 會轉譯 class=「input-validation-error」 屬性。

有三個級聯樣式表單類別可用來控制驗證錯誤的外觀:

  • input-validation-error - 套用至 < Html.TextBox () 協助程式所轉譯的輸入 > 標記。
  • field-validation-error - 套用至 < Html.ValidationMessage () 協助程式所轉譯的 span > 標籤。
  • validation-summary-errors - 套用至 < Html.ValidationSummary () 協助程式所轉譯的 ul > 標籤。

您可以修改這些級聯樣式表單類別,因此修改位於 Content 資料夾中的 Site.css 檔案,以修改驗證錯誤的外觀。

注意

HtmlHelper 類別包含唯讀靜態屬性,可擷取驗證相關 CSS 類別的名稱。 這些靜態屬性的名稱為 ValidationInputCssClassName、ValidationFieldCssClassName 和 ValidationSummaryCssClassName。

預先系結驗證和後置系結驗證

如果您提交 HTML 表單來建立產品,而且您輸入了不正確價格欄位值,而且 UnitsInStock 欄位沒有值,則您會取得圖 4 中顯示的驗證訊息。 這些驗證錯誤訊息來自何處?

Internet Explorer 視窗的螢幕擷取畫面,其中顯示 [股票] 欄位中的 [價格] 和 [單位] 標示驗證錯誤。

圖 04:預先系結驗證錯誤 (按一下即可檢視完整大小的映射)

驗證錯誤訊息實際上有兩種類型-在 HTML 表單欄位系結至類別之前產生的錯誤訊息,以及在表單欄位系結至類別之後產生的錯誤訊息。 換句話說,有預先系結驗證錯誤和後置系結驗證錯誤。

清單 1 中 Product 控制器公開的 Create () 巨集指令會接受 Product 類別的實例。 Create 方法的簽章如下所示:

Public Function Create(<Bind(Exclude:="Id")> ByVal productToCreate As Product) As ActionResult

Create 表單中 HTML 表單欄位的值會由稱為模型系結器的專案系結至 productToCreate 類別。 當預設模型系結器無法將表單欄位系結至表單內容時,會自動將錯誤訊息新增至模型狀態。

預設模型系結器無法將字串 「apple」 系結至 Product 類別的 Price 屬性。 您無法將字串指派給十進位屬性。 因此,模型系結器會將錯誤新增至模型狀態。

預設模型系結器也無法將 Nothing 值指派給不接受 Nothing 值的屬性。 特別是,模型系結器無法將 Nothing 值指派給 UnitsInStock 屬性。 同樣地,模型系結器會放棄,並將錯誤訊息新增至模型狀態。

如果您想要自訂這些預先系結錯誤訊息的外觀,則需要為這些訊息建立資源字串。

總結

本教學課程的目標是描述 ASP.NET MVC 架構中驗證的基本機制。 您已瞭解如何使用模型狀態和驗證 HTML 協助程式。 我們也討論預先系結和後置系結驗證之間的差異。 在其他教學課程中,我們將討論將驗證程式代碼移出控制器和模型類別的各種策略。