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
控件,并将格式设置和验证元数据添加到实体类型的名称和日期字段。
使用 DynamicField 和 DynamicControl 控件
打开Students.aspx页,在控件中StudentsGridView
,将 Name 和 Enrollment 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
控件代替TextBox
Label
学生名称模板字段中的控件,并将DynamicField
控件用于注册日期。 未指定格式字符串。
在控件后面StudentsGridView
添加控件ValidationSummary
。
<asp:ValidationSummary ID="StudentsValidationSummary" runat="server" ShowSummary="true"
DisplayMode="BulletList" Style="color: Red" />
在SearchGridView
控件中,将替换控件中StudentsGridView
名称和注册日期列的标记,但省略EditItemTemplate
元素除外。 控件 Columns
的 SearchGridView
元素现在包含以下标记:
<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.
运行页面。
在 “注册日期 ”列中,时间与日期一起显示,因为属性类型为 DateTime
。 稍后将修复此问题。
目前,请注意动态数据自动提供基本数据验证。 例如,单击“编辑”,清除日期字段,单击“更新”,可以看到动态数据会自动将此字段设置为必填字段,因为数据模型中的值不可为 null。 页面在控件中的 ValidationSummary
字段和错误消息后显示星号:
可以省略 ValidationSummary
控件,因为也可以将鼠标指针悬停在星号上以查看错误消息:
动态数据还将验证在“注册日期”字段中输入的数据是否为有效日期:
如你所看到的,这是一般错误消息。 在下一部分中,你将了解如何自定义邮件以及验证和格式设置规则。
向数据模型添加元数据
通常,你想要自定义动态数据提供的功能。 例如,可以更改数据的显示方式和错误消息的内容。 通常还可以自定义数据验证规则,以提供的功能比动态数据基于数据类型自动提供的功能更多。 为此,请创建对应于实体类型的分部类。
在解决方案资源管理器中,右键单击 ContosoUniversity 项目,选择“添加引用”,然后添加对的System.ComponentModel.DataAnnotations
引用。
在 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页,你会看到日期现在不显示时间:
编辑行并尝试清除名称字段中的值。 在单击“更新”之前,指示字段错误的星号将在离开字段后立即显示。 单击“更新”时,页面会显示指定的错误消息文本。
尝试输入长度超过 25 个字符的名称,单击“更新”,页面将显示指定的错误消息文本。
在数据模型元数据中设置这些格式和验证规则后,只要使用DynamicControl
DynamicField
或控件,规则就会自动应用于显示或允许对这些字段进行更改的每个页面上。 这减少了必须编写的冗余代码量,从而使编程和测试更加轻松,并确保数据格式设置和验证在整个应用程序中保持一致。
更多信息
最后,本系列有关实体框架入门的教程。 若要获取更多资源来帮助你了解如何使用 Entity Framework,请继续 学习下一个 Entity Framework 教程系列 中的第一个教程,或访问以下网站: