添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

利用数据注释模型绑定器在 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 – 所有验证程序属性的基类。
  • 如果任何标准验证程序都不能满足验证需求,则始终可以选择通过从基本 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 属性,可以在错误消息中显示属性时修改属性的名称。 可以显示错误消息“需要 Price 字段”,而不是显示错误消息“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

    最后,可以通过右键单击 Create () 操作并选择菜单选项“添加视图”来创建清单 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>
                    <label for="Name">Name:</label>
                    <%= Html.TextBox("Name") %>
                    <%= Html.ValidationMessage("Name", "*") %>
                    <label for="Description">Description:</label>
                    <%= Html.TextBox("Description") %>
                    <%= Html.ValidationMessage("Description", "*") %>
                    <label for="UnitPrice">Price:</label>
                    <%= Html.TextBox("UnitPrice") %>
                    <%= Html.ValidationMessage("UnitPrice", "*") %>
                    <input type="submit" value="Create" />
            </fieldset>
        <% } %>
            <%=Html.ActionLink("Back to List", "Index") %>
    </asp:Content>
    

    列表 3:Views\Product\Create.aspx

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

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

    图 3:缺少必填字段

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

    图 4:货币金额无效

    通过实体框架使用数据注释验证程序

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

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

    例如,假设你已使用 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 不支持部分属性。 因此,无法通过将验证程序属性应用于 清单 4 中文件中定义的 Movie 类的属性,将验证程序属性应用于 DataModel.Designer.vb 文件中定义的 Movie 类的属性。

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

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

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

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

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

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

    上一页下一页