执行简单验证 (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 类的名称、说明和 UnitsInStock 属性。 如果这些属性中的任何一个未通过验证测试,则会将错误添加到模型状态字典 (Controller 类的 ModelState 属性表示) 。

如果模型状态中有任何错误,则 ModelState.IsValid 属性返回 false。 在这种情况下,将重新显示用于创建新产品的 HTML 表单。 否则,如果没有验证错误,则会将新的 Product 添加到数据库。

使用验证帮助程序

ASP.NET MVC 框架包括两个验证帮助程序:Html.ValidationMessage () 帮助程序和 Html.ValidationSummary () 帮助程序。 在视图中使用这两个帮助程序来显示验证错误消息。

Html.ValidationMessage () 和 Html.ValidationSummary () 帮助程序用于 ASP.NET MVC 基架自动生成的创建和编辑视图。 按照以下步骤生成“创建”视图:

  1. 右键单击 Product 控制器中的“创建” () 操作,然后选择菜单选项 “添加视图 ” (请参阅图 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.ValidationSummary () 帮助程序直接在 HTML 窗体的上方调用。 此帮助程序用于显示验证错误消息的列表。 Html.ValidationSummary () 帮助程序在项目符号列表中呈现错误。

Html.ValidationMessage () 帮助程序在每个 HTML 表单字段旁边调用。 此帮助程序用于在窗体字段旁边显示错误消息。 对于清单 2,Html.ValidationMessage () 帮助程序在出现错误时显示星号。

图 3 中的页面演示了在提交表单时验证帮助程序呈现的错误消息,其中缺少字段和无效值。

Internet Explorer 窗口的屏幕截图,其中显示了“创建”视图,其中包含由填充了无效值的字段导致的错误消息。

图 03:提交有问题的创建视图 (单击以查看全尺寸图像)

请注意,出现验证错误时,也会修改 HTML 输入字段的外观。 当 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。

预绑定验证和后绑定验证

如果提交用于创建 Product 的 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 的属性。 具体而言,模型绑定器不能为 UnitsInStock 属性赋值 Nothing。 模型绑定程序再次放弃并将错误消息添加到模型状态。

如果要自定义这些预绑定错误消息的外观,则需要为这些消息创建资源字符串。

总结

本教程的目的是介绍 ASP.NET MVC 框架中验证的基本机制。 你已了解如何使用模型状态和验证 HTML 帮助程序。 我们还讨论了预绑定和后绑定验证之间的区别。 在其他教程中,我们将讨论将验证代码从控制器移动到模型类的各种策略。