使用 Entity Framework 4.0 Database First 和 ASP.NET 4 Web Forms 入门 - 第 8 部分

作者 :Tom Dykstra

Contoso University 示例 Web 应用程序演示如何使用 Entity Framework 4.0 和 Visual Studio 2010 创建 ASP.NET Web Forms应用程序。 有关教程系列的信息,请参阅 系列中的第一个教程

使用动态数据功能格式化和验证数据

在上一教程中,你实现了存储过程。 本教程将展示动态数据功能如何提供以下优势:

  • 根据字段的数据类型自动设置显示格式。
  • 根据字段的数据类型自动验证字段。
  • 可以将元数据添加到数据模型,以自定义格式设置和验证行为。 执行此操作时,只需在一个位置添加格式和验证规则,它们会自动应用于使用动态数据控件访问字段的所有位置。

若要查看其工作原理,需要更改用于在现有 Students.aspx 页中显示和编辑字段的控件,并将格式设置和验证元数据添加到实体类型的名称和日期字段 Student

Image01

使用 DynamicField 和 DynamicControl 控件

打开 Students.aspx 页,在 控件中 StudentsGridView ,将 NameEnrollment DateTemplateField 元素替换为以下标记:

<asp:TemplateField HeaderText="Name" SortExpression="LastName">
                <EditItemTemplate>
                    <asp:DynamicControl ID="LastNameTextBox" runat="server" DataField="LastName" Mode="Edit" />
                    <asp:DynamicControl ID="FirstNameTextBox" runat="server" DataField="FirstMidName" Mode="Edit" />
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:DynamicControl ID="LastNameLabel" runat="server" DataField="LastName" Mode="ReadOnly" />,
                    <asp:DynamicControl ID="FirstNameLabel" runat="server" DataField="FirstMidName" Mode="ReadOnly" />
                </ItemTemplate>
            </asp:TemplateField>
            <asp:DynamicField DataField="EnrollmentDate" HeaderText="Enrollment Date" SortExpression="EnrollmentDate" />

此标记使用 DynamicControl 控件代替 学生名称模板字段中的 TextBoxLabel 控件,并且对注册日期使用 DynamicField 控件。 未指定格式字符串。

ValidationSummary 控件后面 StudentsGridView 添加控件。

<asp:ValidationSummary ID="StudentsValidationSummary" runat="server" ShowSummary="true"
        DisplayMode="BulletList" Style="color: Red" />

在 控件中 SearchGridView ,替换 NameEnrollment Date 列的标记,就像在 控件中 StudentsGridView 所做的那样,但省略 EditItemTemplate 元素除外。 控件 ColumnsSearchGridView 元素现在包含以下标记:

<asp:TemplateField HeaderText="Name" SortExpression="LastName">
                <ItemTemplate>
                    <asp:DynamicControl ID="LastNameLabel" runat="server" DataField="LastName" Mode="ReadOnly" />,
                    <asp:DynamicControl ID="FirstNameLabel" runat="server" DataField="FirstMidName" Mode="ReadOnly" />
                </ItemTemplate>
            </asp:TemplateField>
            <asp:DynamicField DataField="EnrollmentDate" HeaderText="Enrollment Date" SortExpression="EnrollmentDate" />

打开 Students.aspx.cs 并添加以下 using 语句:

using ContosoUniversity.DAL;

为页面的 Init 事件添加处理程序:

protected void Page_Init(object sender, EventArgs e)
{
    StudentsGridView.EnableDynamicData(typeof(Student));
    SearchGridView.EnableDynamicData(typeof(Student));
}

此代码指定动态数据将在这些数据绑定控件中为实体的 Student 字段提供格式设置和验证。 如果在运行页面时收到类似于以下示例的错误消息,这通常意味着你忘记在 中Page_Init调用 EnableDynamicData 方法:

Could not determine a MetaTable. A MetaTable could not be determined for the data source 'StudentsEntityDataSource' and one could not be inferred from the request URL.

运行页面。

Image03

在“ 注册日期” 列中,时间与日期一起显示,因为属性类型为 DateTime。 稍后将解决此问题。

现在请注意,动态数据会自动提供基本数据验证。 例如,单击 “编辑”,清除日期字段,单击“ 更新”,将看到“动态数据”自动将此字段设置为必填字段,因为该值在数据模型中不可为 null。 页面在 字段后显示星号,并在 控件中 ValidationSummary 显示错误消息:

Image05

可以省略 ValidationSummary 控件,因为也可以将鼠标指针悬停在星号上方以查看错误消息:

Image06

动态数据还将验证在 “注册日期” 字段中输入的数据是否为有效日期:

Image04

如你所看到的,这是一条通用错误消息。 在下一部分中,你将了解如何自定义消息以及验证和格式设置规则。

向数据模型添加元数据

通常,你想要自定义动态数据提供的功能。 例如,可以更改数据的显示方式和错误消息的内容。 通常还会自定义数据验证规则,以提供比动态数据基于数据类型自动提供的功能更多的功能。 为此,请创建与实体类型对应的分部类。

“解决方案资源管理器”中,右键单击 ContosoUniversity 项目,选择“添加引用”,然后添加对 的System.ComponentModel.DataAnnotations引用。

Image11

DAL 文件夹中,创建一个新的课堂文件,将其命名为 Student.cs,并将其中模板代码替换为以下代码。

using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

namespace ContosoUniversity.DAL
{
    [MetadataType(typeof(StudentMetadata))]
    public partial class Student
    {
    }

    public class StudentMetadata
    {
        [DisplayFormat(DataFormatString="{0:d}", ApplyFormatInEditMode=true)]
        public DateTime EnrollmentDate { get; set; }

        [StringLength(25, ErrorMessage = "First name must be 25 characters or less in length.")]
        [Required(ErrorMessage="First name is required.")]
        public String FirstMidName { get; set; }

        [StringLength(25, ErrorMessage = "Last name must be 25 characters or less in length.")]
        [Required(ErrorMessage = "Last name is required.")]
        public String LastName { get; set; }
    }
}

此代码为 Student 实体创建分部类。 MetadataType应用于此分部类的属性标识用于指定元数据的类。 元数据类可以具有任何名称,但使用实体名称加上“元数据”是一种常见做法。

应用于元数据类中的属性的属性指定格式设置、验证、规则和错误消息。 此处显示的属性将产生以下结果:

  • EnrollmentDate 将显示为没有时间) 的日期 (。
  • 这两个名称字段的长度必须为 25 个字符或更少,并且会提供自定义错误消息。
  • 这两个名称字段都是必需的,并且提供了自定义错误消息。

再次运行 Students.aspx 页,你会看到日期现在不显示时间:

Image08

编辑行并尝试清除名称字段中的值。 一旦离开某个字段,就会显示指示字段错误的星号,然后再单击“ 更新”。 单击“ 更新”时,页面将显示指定的错误消息文本。

Image10

尝试输入长度超过 25 个字符的名称,单击“ 更新”,页面将显示指定的错误消息文本。

Image09

现在,你已在数据模型元数据中设置了这些格式设置和验证规则,只要你使用 DynamicControlDynamicField 控件,规则将自动应用于显示或允许更改这些字段的每个页面上。 这减少了必须编写的冗余代码量,使编程和测试更加容易,并确保数据格式设置和验证在整个应用程序中保持一致。

更多信息

关于使用实体框架入门的这一系列教程到此结束。 有关帮助你了解如何使用实体框架的更多资源,请继续学习 下一个实体框架教程系列中的第一个教程 ,或访问以下网站: