使用 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
。
使用 DynamicField 和 DynamicControl 控件
打开 Students.aspx 页,在 控件中 StudentsGridView
,将 Name 和 Enrollment 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
控件代替 学生名称模板字段中的 TextBox
和 Label
控件,并且对注册日期使用 DynamicField
控件。 未指定格式字符串。
在 ValidationSummary
控件后面 StudentsGridView
添加控件。
<asp:ValidationSummary ID="StudentsValidationSummary" runat="server" ShowSummary="true"
DisplayMode="BulletList" Style="color: Red" />
在 控件中 SearchGridView
,替换 Name 和 Enrollment Date 列的标记,就像在 控件中 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
字段提供格式设置和验证。 如果在运行页面时收到类似于以下示例的错误消息,这通常意味着你忘记在 中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.
运行页面。
在“ 注册日期” 列中,时间与日期一起显示,因为属性类型为 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
应用于此分部类的属性标识用于指定元数据的类。 元数据类可以具有任何名称,但使用实体名称加上“元数据”是一种常见做法。
应用于元数据类中的属性的属性指定格式设置、验证、规则和错误消息。 此处显示的属性将产生以下结果:
EnrollmentDate
将显示为没有时间) 的日期 (。- 这两个名称字段的长度必须为 25 个字符或更少,并且会提供自定义错误消息。
- 这两个名称字段都是必需的,并且提供了自定义错误消息。
再次运行 Students.aspx 页,你会看到日期现在不显示时间:
编辑行并尝试清除名称字段中的值。 一旦离开某个字段,就会显示指示字段错误的星号,然后再单击“ 更新”。 单击“ 更新”时,页面将显示指定的错误消息文本。
尝试输入长度超过 25 个字符的名称,单击“ 更新”,页面将显示指定的错误消息文本。
现在,你已在数据模型元数据中设置了这些格式设置和验证规则,只要你使用 DynamicControl
或 DynamicField
控件,规则将自动应用于显示或允许更改这些字段的每个页面上。 这减少了必须编写的冗余代码量,使编程和测试更加容易,并确保数据格式设置和验证在整个应用程序中保持一致。
更多信息
关于使用实体框架入门的这一系列教程到此结束。 有关帮助你了解如何使用实体框架的更多资源,请继续学习 下一个实体框架教程系列中的第一个教程 ,或访问以下网站:
反馈
https://aka.ms/ContentUserFeedback。
即将推出:在整个 2024 年,我们将逐步取消以“GitHub 问题”作为内容的反馈机制,并将其替换为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈