Entity Framework 4.0 Database First 和 ASP.NET 4 Web 窗体入门 - 第 8 部分

作者:Tom Dykstra

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

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

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

  • 字段会自动设置格式,以便根据其数据类型进行显示。
  • 字段根据其数据类型自动验证。
  • 可以将元数据添加到数据模型,以自定义格式设置和验证行为。 执行此操作时,只需在一个位置添加格式和验证规则,即可使用动态数据控件在访问字段的任何地方自动应用这些规则。

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

Image01

使用 DynamicField 和 DynamicControl 控件

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

<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控件用于注册日期。 未指定格式字符串。

在控件后面StudentsGridView添加控件ValidationSummary

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

SearchGridView控件中,将替换控件中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 的这些数据绑定控件中提供格式和验证。 如果在运行页面时收到如下例所示的错误消息,这通常意味着忘记了 EnableDynamicData 调用 Page_Init该方法:

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应用于此分部类的属性标识用于指定元数据的类。 元数据类可以具有任何名称,但使用实体名称加上“Metadata”是一种常见做法。

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

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

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

Image08

编辑行并尝试清除名称字段中的值。 在单击“更新之前,指示字段错误的星号将在离开字段后立即显示。 单击“更新时,页面会显示指定的错误消息文本。

Image10

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

Image09

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

更多信息

最后,本系列有关实体框架入门的教程。 若要获取更多资源来帮助你了解如何使用 Entity Framework,请继续 学习下一个 Entity Framework 教程系列 中的第一个教程,或访问以下网站: