使用数据注释验证程序进行验证 (C#)

Microsoft

利用数据注释模型绑定器在 ASP.NET MVC 应用程序中执行验证。 了解如何使用不同类型的验证程序属性并在 Microsoft 实体框架中使用它们。

本教程介绍如何使用数据注释验证程序在 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 命名空间包含以下验证程序属性:

  • Range – 用于验证属性值是否介于指定的值范围之间。
  • 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

注意

从“ 添加视图 ”菜单选项生成的“创建窗体”中删除“ID”字段。 由于“Id”字段对应于“标识”列,因此你不希望允许用户为此字段输入值。

如果提交表单以创建产品,但未输入必填字段的值,则会显示 图 3 中的验证错误消息。

所有验证错误的图像

图 3:缺少必填字段

如果输入的货币金额无效,则显示 图 4 中的错误消息。

无效货币验证错误的图像

图 4:货币金额无效

将数据注释验证程序与实体框架配合使用

如果使用 Microsoft 实体框架生成数据模型类,则无法将验证程序属性直接应用于类。 由于 Entity Framework Designer生成模型类,因此下次在Designer中进行任何更改时,将覆盖对模型类所做的任何更改。

如果要将验证程序与 Entity Framework 生成的类一起使用,则需要创建元数据类。 将验证程序应用于元数据类,而不是将验证程序应用于实际类。

例如,假设你已使用 Entity Framework 创建了 Movie 类 (请参阅 图 5) 。 此外,假设你希望使“电影标题”和“导演”属性成为必需属性。 在这种情况下,可以在 清单 4 中创建分部类和元数据类。

电影类的图像

图 5:实体框架生成的 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 文件。

目前,.NET Framework 不支持部分属性。 因此,无法将验证程序属性应用于 DataModel 中定义的 Movie 类的属性。Designer.vb 文件,方法是将验证程序属性应用于清单 4 中定义的 Movie 类的属性。

请注意,Movie 分部类使用指向 MovieMetaData 类的 MetadataType 属性进行修饰。 MovieMetaData 类包含 Movie 类属性的代理属性。

验证程序属性应用于 MovieMetaData 类的属性。 Title、Director 和 DateReleased 属性都标记为必需属性。 必须为 Director 属性分配包含少于 5 个字符的字符串。 最后,DisplayName 属性应用于 DateReleased 属性以显示错误消息,例如“需要 DateReleased 字段”。而不是错误“DateReleased 字段是必需的”。

注意

请注意,MovieMetaData 类中的代理属性不需要表示与 Movie 类中的相应属性相同的类型。 例如,Director 属性是 Movie 类中的字符串属性,是 MovieMetaData 类中的对象属性。

图 6 中的页面演示了在为 Movie 属性输入无效值时返回的错误消息。

无效电影值的错误消息图像

图 6:将验证程序与实体框架配合使用 (单击以查看全尺寸图像)

总结

本教程介绍了如何利用数据注释模型绑定器在 ASP.NET MVC 应用程序中执行验证。 你已了解如何使用不同类型的验证程序属性,例如 Required 和 StringLength 属性。 你还了解了在使用 Microsoft 实体框架时如何使用这些属性。