更新: 2008 年 7 月
本演练演示如何修改现有的 ASP.NET 网站,使其包括动态数据框架功能。另外,本演练还演示了可用来自定义动态数据网站的方式。在本演练结束时,您将拥有一个可正常工作的网站,该网站使用数据模型来与数据库进行交互。而且,您将拥有多个自定义的字段模板,这些模板定义如何呈现数据字段(用于显示和编辑)。
用于界定 ASP.NET 动态数据的一个方面就是它能够在运行时,从代表数据库的数据模型推断数据字段的外观和行为。这些信息随后将用在数据控件中,并且由于支持字段模板,而不再需要在表示层中使用重复性代码。
本演练演示如何用最少的代码来执行以下操作:
- 与数据模型交互。动态数据合并了一些可帮助您创建数据驱动应用程序的功能,这些应用程序可以执行创建、读取、更新和删除 (CRUD) 操作。 
- 通过创建字段模板来自定义用户查看和编辑数据字段的方式。动态数据基于从数据模型推断的信息选择适当的字段模板。 
您将完成下列步骤:
- 创建一个网站,然后将其修改为支持动态数据。此任务的主要目标就是创建一个数据模型,动态数据将使用该数据模型与数据库进行交互。 
- 创建字段模板。字段模板是用户控件,用于定义 UI 以确定数据的显示和编辑方式。 
- 创建一个用来显示表的自定义页。此页演示动态数据如何与数据库进行交互,以及您如何用最少的代码来完成该任务。 
- 测试动态数据集成。这样您可以确保网站中已集成了动态数据功能。您可以与数据模型进行交互并验证应用程序是否按预期方式工作。在这个过程中,您将生成和处理错误。 
先决条件
为了完成本主题中的示例,您需要以下各项:
- Microsoft Visual Studio 2008 Service Pack 1 或 Visual Web Developer 2008 速成版 Service Pack 1。 
- AdventureWorksLT 示例数据库。有关如何下载和安装 SQL Server 示例数据库的信息,请参见 CodePlex 站点上的 Microsoft SQL Server Product Samples: Database(Microsoft SQL Server 产品示例:数据库)。请确保安装了针对所运行的 SQL Server 版本(Microsoft SQL Server 2005 或 Microsoft SQL Server 2008)的示例数据库正确版本。 
创建动态数据网站
在本节中,您将在 Visual Studio 中创建一个动态数据网站。您将从一个标准的 ASP.NET 网站开始,然后将其转换为支持动态数据功能的网站。为此,请执行以下操作:
- 创建一个 ASP.NET 网站。 
- 将该网站连接到一个数据库。此数据库包含一个表,您将访问该表中的列(数据字段)来进行自定义显示和编辑。 
- 将该网站配置为使用动态数据控件。这将允许在网站中集成动态数据功能。 
随后,将创建和配置一个您将使用的数据模型。您将进行以下操作:
- 基于 SQL Server 数据库创建数据模型类。. 
- 向数据模型中添加元数据,以便实现对用户输入进行自定义验证,并在稍后启用一个 Calendar 控件来修改数据字段。 
针对动态数据准备网站
本节演示如何创建 ASP.NET 网站、如何添加数据库以及如何将网站配置为集成动态数据功能。
创建 ASP.NET 网站
- 启动 Visual Studio。 
- 在**“文件”菜单上,单击“新建”,再单击“网站”**。 - 显示**“新建网站”**对话框。 
- 在**“Visual Studio 已安装的模板”下,选择“ASP.NET 网站”**。 
- 在**“位置”旁边,选择“文件系统”**,在第二个框中,输入用于保存网页的文件夹名称。例如,输入文件夹名称“C:\WebSites\DynamicDataWebSite”。 
- 在**“语言”**列表中,选择您想使用的编程语言。 
- 单击**“确定”**。 - Visual Studio 将为 ASP.NET 网站创建文件夹和文件。 
下一步是向网站中添加数据库。此数据库包含一个表,您将访问该表中的列(数据字段)来进行显示和编辑。
向网站中添加数据库
- 在**“解决方案资源管理器”中,右击 App_Data 文件夹,然后单击“添加现有项”**。 
- 在**“添加现有项”对话框中,输入 AdventureWorksLT 数据库文件 (AdventureWorksLT.mdf) 的安装位置,然后单击“添加”**。 - 这将创建项目中数据库文件的副本。 
现在,可以将网站配置为集成动态数据功能。
配置网站
- 在**“解决方案资源管理器”**中,打开 Web.config 文件。 
- 添加对以下程序集的程序集引用: - System.Web.Routing 
- System.Web.DynamicData 
- System.ComponentModel.DataAnnotations 
 - 下面的示例演示如何添加程序集。请确保您使用的是正确版本的程序集。 - <system.web> <compilation> <assemblies> <add assembly="System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add assembly="System.Web.DynamicData, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add assembly="System.ComponentModel.DataAnnotations, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> </assemblies> </compilation>
- 配置 asp 标记前缀,使其引用 System.Web.DynamicData 命名空间,如下面的示例所示: - <system.web> <pages> <controls> <add tagPrefix="asp" namespace="System.Web.DynamicData" assembly="System.Web.DynamicData, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> </controls> </pages> </system.web>
- 保存并关闭 Web.config 文件。 
设置数据模型
本节演示如何创建数据模型,在实现网站的动态行为时,数据模型是一个关键的组件。在本演练中,您将使用 LINQ-to-SQL 数据模型。但是,您可以改用 ADO.NET Entity Framework 数据模型。本节还演示了如何向数据模型中添加元数据信息。
创建数据模型
- 在**“解决方案资源管理器”中,右击项目名称,单击“添加 ASP.NET 文件夹”,再单击“App_Code”**。 
- 右击 App_Code 文件夹,然后单击**“添加新项”**。 
- 在**“Visual Studio 已安装的模板”下,单击“LINQ to SQL 类”**。 
- 在**“名称”**框中,输入数据库模型的名称 AdventureWorksLT.dbml。 
- 单击**“添加”**。 - 此时将显示对象关系设计器(O/R 设计器)。有关更多信息,请参见对象关系设计器(O/R 设计器)。 
- 在 O/R 设计器中,单击**“服务器资源管理器”**链接。 
- 在**“服务器资源管理器”中,在“数据连接”下面,展开“AdventureWorksLT_Data.mdf”节点,然后展开“表”**节点。 
- 将 Customer 表拖到“O/R 设计器”窗口中。 
- 保存并关闭 AdventureWorksLT.dbml 文件。 - 您已经创建了一个表示 AdventureWorksLT 数据库的数据模型。 
下一个过程将演示如何添加对用户输入的自定义验证,还将演示如何使用 Calendar 控件来呈现用来显示和编辑 DateTime 数据字段的 UI
向数据模型中添加自定义验证和元数据
- 在**“解决方案资源管理器”中,右击 App_Code 文件夹,然后单击“添加新项”**。 
- 在**“Visual Studio 已安装的模板”下,单击“类”**。 
- 在**“名称”**框中,输入(在数据模型中定义的)数据库表的名称,该表中包含可供自定义字段模板显示的数据。在本演练中,将使用 Customer 类。因此,请创建一个名为 Customer.cs 或 Customer.vb 的类文件。此文件还将包含一个关联类,您将在以后创建该类,以便向数据字段应用属性。 
- 将 Visual Basic 中的 Partial 关键字或 Visual C# 中的 partial 关键字添加到 Customer 类定义中,使其成为分部类。 
- 如果是在 Visual C# 中创建该类,请删除默认的构造函数。 - 下面的示例演示了更新后的类声明。 - public partial class Customer { }- Partial Public Class Customer End Class
- 使用 Visual Basic 中的 Imports 关键字或 Visual C# 中的 using 关键字,添加对 System.Web.DynamicData 和 System.ComponentModel.DataAnnotations 命名空间的引用,如下面的示例所示: - using System.Web.DynamicData; using System.ComponentModel.DataAnnotations;- Imports System.Web.DynamicData Imports System.ComponentModel.DataAnnotations
- 在同一个文件中,创建另一个将充当关联元数据类的分部类。对于该类,可以使用任意名称。在本演练中,将该类命名为 CustomerMetadata,如下面的示例所示: - public partial class CustomerMetadata { }- Partial Public Class CustomerMetadata End Class
- 将 MetadataTypeAttribute 属性应用于 Customer 分部类。对于此属性的参数,请指定 CustomerMetadata,这是上一步中创建的关联元数据类的名称。 - 下面的示例演示已应用此属性的 Customer 分部类。 - [MetadataType(typeof(CustomerMetadata))] public partial class Customer { }- <MetadataType(GetType(CustomerMetadata))> _ Partial Public Class Customer End Class
- 在元数据类中,创建一个名为 ModifiedDate 而且已类型化为 Object 的公共字段。 - 在元数据类中,对于要自定义其显示和编辑行为的每个数据字段,均为其创建一个字段。对于元数据类中的字段名称,将使用与要修改的数据字段相同的名称。 
- 将 UIHintAttribute 属性应用于 ModifiedDate 字段。对于该参数,请指定“DateCalendar”。这是将在以后创建的字段模板的名称。 .gif) 说明: 说明:- Object 在元数据类型中用作可表示数据字段的标记。动态数据从数据模型推断实际类型。 - 下面的示例演示了已应用的 UIHintAttribute 属性。 - public partial class CustomerMetadata { [UIHint("DateCalendar")] public object ModifiedDate; }- Partial Public Class CustomerMetadata <UIHint("DateCalendar")> _ Public ModifiedDate As Object End Class
- 在元数据类中,为 FirstName 和 LastName 属性创建公共字段。 
- 将 RegularExpressionAttribute 属性应用于 FirstName 和 LastName 数据字段。指定一个正则表达式模式,该模式只允许使用字母字符、空格和连字符,而且会将名称限制为 40 个字符。包括一则在验证失败时要显示的自定义错误消息 - 下面的示例演示已应用该属性的 FirstName 和 LastName 字段。 - [RegularExpression(@"^[a-zA-Z''-'\s]{1,40}$", ErrorMessage="Entered characters are not allowed.")] public object FirstName; [RegularExpression(@"^[a-zA-Z''-'\s]{1,40}$", ErrorMessage = "Entered characters are not allowed.")] public object LastName;- <RegularExpression("^[a-zA-Z''-'\s]{1,40}$", _ ErrorMessage:="Entered characters are not allowed.")> _ Public FirstName As Object <RegularExpression("^[a-zA-Z''-'\s]{1,40}$", _ ErrorMessage:="Entered characters are not allowed.")> _ Public LastName As Object- 请注意,这些数据字段与数据模型中所定义的 Customer 表列相匹配,只能用来添加动态数据在呈现这些数据字段时所使用的元数据信息。 - 该正则表达式模式最多允许使用 40 个字符,其中可以包括大写字符、小写字符和在英文名称中常见的几个特殊字符。 
- 保存并关闭类文件。 
现在,可以注册数据模型上下文,以便动态数据可以访问元数据信息。
注册数据模型上下文
- 在**“解决方案资源管理器”中,右击项目名称,然后单击“添加新项”**。 
- 在**“Visual Studio 已安装的模板”下,选择“全局应用程序类”,然后单击“添加”**。 - 这将向网站中添加 Global.asax 文件。 
- 添加一个具有 Namespace 属性的 @ Import 指令,该属性引用 System.Web.DynamicData 命名空间,如下面的示例所示: - <%@ Import Namespace="System.Web.DynamicData" %>
- 在 Application_Start 方法中,在禁用支架选项的情况下注册数据上下文,如下面的示例所示。 - 此注册会通知动态数据要使用哪个数据模型,还将通知动态数据不要启用要对于支架可见的表。最后一步不是必需的,但是在这里可用来强调网站不使用支架。 - MetaModel model = new MetaModel(); model.RegisterContext(typeof(AdventureWorksLTDataContext), new ContextConfiguration() {ScaffoldAllTables = false });- Dim model As MetaModel = New MetaModel() model.RegisterContext(GetType( _ AdventureWorksLTDataContext), _ New ContextConfiguration() With { _ .ScaffoldAllTables = False})
- 保存并关闭 Global.asax 文件。 
创建字段模板
字段模板是用户控件,动态数据将使用它们来呈现用于显示和编辑数据字段的 UI。动态数据要求对于数据上下文中所表示的每个数据字段类型都存在字段模板。(如果对于特定的数据字段类型不存在字段模板,而且使用回退规则也找不到字段模板,则动态数据将引发异常。)
如果您创建动态数据网站,网站中将包括一组字段模板,这些模板表示典型的数据库数据类型。这些字段模板将与页面模板、母版页和级联样式表文件一起创建。但是,在本演练中,您将学习如何向现有网站中添加动态数据功能。因此,我们假定您无法访问默认的字段模板。
您在本演练中创建的字段模板将与动态数据网站中的默认模板相似。有关更多信息,请参见 ASP.NET 动态数据字段模板概述。您可以查看在创建使用支架的网站时所生成的默认字段模板。有关更多信息,请参见演练:使用基架创建新的动态数据网站。
本节演示如何创建以下模板:
- 所呈现的 UI 用来显示和编辑 String 类型数据字段的字段模板。 
- 所呈现的 UI 用来显示和编辑 DateTime 类型数据字段的字段模板。 
为 String 数据创建字段模板
本节演示如何创建所呈现的 UI 用来显示和编辑 String 数据字段的字段模板。
创建用来显示和编辑 String 数据字段的字段模板
- 在**“解决方案资源管理器”中,右击项目名称,然后单击“新建文件夹”**。 
- 将这个新文件夹重命名为 DynamicData。 .gif) 说明: 说明:- 因为文件夹名称在动态数据中具有特殊含义,所以您必须使用此过程中描述的文件夹名称。 
- 在**“解决方案资源管理器”中,右击 DynamicData 文件夹,然后单击“新建文件夹”**。 
- 将这个新文件夹重命名为 FieldTemplates。 
- 在**“解决方案资源管理器”中,右击 FieldTemplates 文件夹,然后单击“添加新项”**。 
- 在**“Visual Studio 已安装的模板”下,单击“动态数据字段”**。 
- 在**“名称”框中输入 Text.ascx。请确保已选中“将代码放在单独的文件中”**。 
- 单击**“添加”**。 - 将创建两个名称分别为 Text.ascx 和 Text_Edit.ascx 的字段模板。第一个控件呈现用来显示 String 数据字段的 UI,第二个控件呈现用来编辑 String 数据字段的 UI。 
- 打开 Text_Edit.ascx 文件,然后在 @ Control 指令中,将 AutoEventWireup 属性设置为 true。 
- 保存并关闭这些用户控件文件。 - 现在,您已经创建了所呈现的 UI 用来显示和编辑 String 数据字段的字段模板。 
创建 DateTime 字段模板
本节演示如何创建所呈现的 UI 用来显示和编辑 DateTime 数据字段的字段模板。显示字段模板使用不包括时间的短日期表示形式。编辑字段模板使用 Calendar 控件来允许用户输入新值。
创建用来显示和编辑 DateTime 数据字段的字段模板
- 在**“解决方案资源管理器”中,右击 DynamicData\FieldTemplates 文件夹,然后单击“添加新项”**。 
- 在**“Visual Studio 已安装的模板”下,单击“动态数据字段”**。 
- 在**“名称”框中输入 DateCalendar.ascx。请确保已选中“将代码放在单独的文件中”**。 
- 单击**“添加”**。 - 将创建两个名称分别为 DateCalendar.ascx 和 DateCalendar_Edit.ascx 的字段模板。第一个控件呈现用来显示 DateTime 数据字段的 UI,第二个控件呈现用来编辑 DateTime 数据字段的 UI。 
- 打开 DateCalendar.ascx 文件。 
- 在 Literal 控件中,删除赋给 Text 属性的 FieldValueString 值,如下面的示例所示。 - <asp:Literal ID="Literal1" runat="server"/>
- 保存并关闭该用户控件文件。 
- 打开 DateCalendar.ascx.vb 或 DateCalendar.ascx.cs 字段模板代码隐藏文件。 
- 重写用户控件的 OnDataBinding 方法,以便通过排除时间来设置要显示的 DateTime 值的格式,如下面的示例所示。此字段的值在 FieldValue 中提供。 - protected override void OnDataBinding(EventArgs e) { base.OnDataBinding(e); string shortDate = string.Empty; if (FieldValue != null) { DateTime dt = (DateTime)FieldValue; shortDate = dt.ToShortDateString(); } Literal1.Text = shortDate; }- Protected Overloads Overrides Sub OnDataBinding( _ ByVal e As EventArgs) MyBase.OnDataBinding(e) Dim shortDate As String = String.Empty If FieldValue IsNot Nothing Then Dim dt As DateTime = Format(CType(FieldValue, DateTime), "d") shortDate = dt.ToShortDateString() End If Literal1.Text = shortDate End Sub
- 保存并关闭该代码隐藏文件。 
- 打开 DateCalendar_Edit.ascx 文件。 
- 在 @ Control 指令中,将 AutoEventWireup 属性设置为 true。 
- 在 TextBox 控件中,将 Text 属性中的 FieldValueString 表达式替换为自定义的 GetDateString() 方法,如下面的示例所示。 - <asp:TextBox ID="TextBox1" runat="server" Text='<%# GetDateString() %>' > </asp:TextBox>
- 将下面的标记添加到该文件中,以便定义 Calendar 控件,该控件所呈现的 UI 允许用另一种方法编辑日期。 - <asp:Calendar ID="Calendar1" runat="server" VisibleDate= '<%# (FieldValue != null) ? FieldValue : DateTime.Now %>' SelectedDate= '<%# (FieldValue != null) ? FieldValue : DateTime.Now %>' OnSelectionChanged="Calendar1_SelectionChanged" />- <asp:Calendar ID="Calendar1" runat="server" VisibleDate= '<%# If(FieldValue,DateTime.Now)%>' SelectedDate= '<%# If(FieldValue,DateTime.Now) %>' OnSelectionChanged="Calendar1_SelectionChanged" />
- 保存并关闭该字段模板文件。 
- 打开 DateCalendar_Edit.ascx.vb 或 DateCalendar_Edit.ascx.cs 代码隐藏文件。 
- 添加一个 GetDateString 方法。在该方法中,处理用户通过 TextBox 控件输入的内容。该方法使用不包括时间的短日期格式来设置日期格式。 - 下面的示例演示如何执行此操作。 - protected string GetDateString() { if (FieldValue != null) { DateTime dt = (DateTime)FieldValue; return dt.ToShortDateString(); } else return string.Empty; }- Protected Function GetDateString() As String If FieldValue <> Nothing Then Dim dt As DateTime = Format(CType(FieldValue, DateTime), "d") Return dt.ToShortDateString() Else Return String.Empty End If End Function
- 为 Calendar 控件的 SelectionChanged 事件添加处理程序。 
- 在该处理程序中,将 TextBox 控件的 Text 属性设置为日历中所选日期的格式正确的版本。这将在文本框中显示用户当前选择的内容。 - 下面的示例演示该处理程序。 - protected void Calendar1_SelectionChanged( object sender, EventArgs e) { // Display value using the short date format. TextBox1.Text = Calendar1.SelectedDate.ToString("d"); }- Protected Sub Calendar1_SelectionChanged( _ ByVal sender As Object, ByVal e As EventArgs) ' Display value using the short date format. TextBox1.Text = Calendar1.SelectedDate.ToString("d") End Sub
- 保存并关闭该字段模板文件。 - 现在,您已经创建了所呈现的 UI 用来显示和编辑 DateTime 数据字段类型的字段模板。这些字段模板指令动态数据应用适当的格式和验证。如果验证失败,这些字段模板还将生成相应的错误消息。 
创建用来显示 Customer 表的自定义页
本节演示如何使用具有动态行为的 GridView 控件,来创建用来显示 Customer 表的自定义页。
该控件的动态行为通过以下代码来实现:
- 利用 DynamicDataManager 控件注册该控件。 
- 对于要显示的每个数据字段,向 Columns 属性中添加 DynamicField 元素。 
该数据库表中包含 String 和 DateTime 数据字段类型。因此,当您使用具有动态行为的 GridView 控件显示表数据时,动态数据将使用已经创建的自定义字段模板。
创建用来显示 Customers 表的自定义页
- 在**“解决方案资源管理器”中,右击项目名称,然后选择“添加新项”**。 
- 在**“Visual Studio 已安装的模板”下,选择“Web 窗体”**。 - 在**“名称”框中输入 Customers.aspx。请确保已选中“将代码放在单独的文件中”**。 
- 在 @ Page 指令中,将 AutoEventWireup 属性设置为 true。 
- 在“源”视图中,向该页的正文中添加 DynamicDataManager 控件,如下面的示例所示: - <body> <asp:DynamicDataManager ID="DynamicDataManager1" runat="server"/> </body>- DynamicDataManager 控件指令动态数据将该页中的数据控件作为动态控件来处理。 
- 从**“工具箱”的“数据”**选项卡中,向该页中添加一个 LinqDataSource 控件。 
- 将 LinqDataSource 控件的 EnableUpdate 属性设置为 true。 - 这将允许针对数据控件执行更新操作。 
- 将 LinqDataSource 控件的 TableName 属性设置为要使用的表 (Customers)。 
- 将 ContextTypeName 属性设置为数据上下文类 (AdventureWorksLTDataContext),如下面的示例所示: - <asp:LinqDataSource ID="LinqDataSource1" runat="server" TableName="Customers" ContextTypeName="AdventureWorksLTDataContext" EnableUpdate="true"> </asp:LinqDataSource>
- 从**“工具箱”的“数据”**选项卡中,向该页中添加一个 GridView 控件。 - 此控件将用来显示和修改数据字段。 
- 将 GridView 控件的 DataSourceID 属性设置为 LinqDataSource 控件的 ID,如下面的示例所示: - <form ID="Form1" runat="server" > <asp:GridView ID="GridView1" runat="server" DataSourceID="LinqDataSource1" > </asp:GridView> </form>
- 将 GridView 控件的 AutoGenerateColumns 属性设置为 false,将 AutoGenerateEditButton 属性设置为 true,如下面的示例所示: - <asp:GridView ID="GridView1" runat="server" AutoGenerateEditButton="true" AutoGenerateColumns="false" > </asp:GridView>- 这将针对基于数据库表的列启用编辑操作并禁用自动生成功能。您将需要改用 DynamicField 控件来填充 GridView 控件。 
- 将 GridView 控件的 AllowPaging 和 AllowSorting 属性设置为 true,如下面的示例所示: - <asp:GridView ID="GridView1" runat="server" AllowPaging="true" AllowSorting="true" > </asp:GridView>
- 向 Columns 属性中添加三个 DynamicField 控件,并将这三个控件的 DataField() 属性分别设置为“FirstName”、“LastName”和“ModifiedDate”。 - DynamicField 控件使用 ASP.NET 动态数据,从数据模型中读取数据,并借助于相应的字段模板来设置数据格式。请注意,您不必在 DynamicField 控件中包括任何有关如何读取数据或设置数据格式的信息。这些任务会由动态数据自动处理。 - 下面的示例演示在添加 DynamicField 控件之后,GridView 控件的标记。 - <asp:GridView ID="GridView1" runat="server"> <Columns> <asp:DynamicField DataField="FirstName" /> <asp:DynamicField DataField="LastName" /> <asp:DynamicField DataField="ModifiedDate" /> </Columns> </asp:GridView>.gif) 说明: 说明:- DynamicField 控件不在“工具箱”中。因此,您必须将它作为一个标记添加到“源”视图中。 
- 保存并关闭 Customers.aspx 文件。 - 现在,您已经创建了用来访问 Customers 表的自定义页。 
- 打开 Customers.aspx.cs 或 Customers.aspx.vb 代码隐藏文件。 
- 使用 Visual Basic 中的 Imports 关键字或 Visual C# 中的 using 关键字,添加对 System.Web.DynamicData 命名空间的引用,如下面的示例所示: - using System.Web.DynamicData;- Imports System.Web.DynamicData
- 创建 Page_Init 方法,如下面的示例所示: - protected void Page_Init(object sender, EventArgs e) { }- Protected Sub Page_Init(ByVal sender As Object, _ ByVal e As EventArgs) End Sub
- 在 Page_Init 方法中,向 DynamicDataManager 注册 GridView 控件,以便启用动态行为。 - 下面的示例演示如何执行此操作。 - protected void Page_Init(object sender, EventArgs e) { DynamicDataManager1.RegisterControl(GridView1); }- Protected Sub Page_Init(ByVal sender As Object, _ ByVal e As EventArgs) DynamicDataManager1.RegisterControl(GridView1) End Sub
- 关闭该代码隐藏文件。 
测试动态数据
本节演示如何确保网站中已集成了动态数据功能。您可以通过数据模型与数据库进行交互并验证集成功能是否正常工作。您将看到数据何时进行修改,如果您提供的值无效,动态数据会基于从数据库推断的信息,生成相应的错误消息。
测试是否已集成动态数据功能
- 在**“解决方案资源管理器”中,右击 Customers.aspx 页,然后选择“在浏览器中查看”**。 - 浏览器中显示一个页面,其中包含具有选定列的 Customers 表。 
- 在任一行上,单击**“编辑”**并清除名字。 
- 在同一行上,单击**“更新”**。 - 动态数据将显示一则错误消息,警告您 FirstName 数据字段中不允许使用空字符串。 
- 在同一行上,单击**“取消”**。 
- 在任一行上,单击**“编辑”**,然后更改姓氏。 
- 在同一行上,单击**“更新”**。 - 动态数据将更新该数据库。如果您针对姓氏输入的值有效,那么,该数据将能够通过验证控件,该控件是前面所生成的字段模板的一部分。 
- 在任一行上,单击**“编辑”**并针对名字或姓氏输入非字母字符。 
- 在同一行上,单击**“更新”**。 - 动态数据将显示您用正则表达式指定的自定义错误消息,警告您输入的是不允许使用的字符。 
- 在同一行上,单击**“取消”**。 
- 在任一行上,单击**“编辑”**并清除日期。 
- 在同一行上,单击**“更新”**。 - 动态数据将显示一则错误消息,警告您 ModifiedDate 数据字段中不允许使用空字符串。 
- 在同一行上,单击**“取消”**。 
- 在任一行上,单击**“编辑”**,然后使用 Calendar 控件更改日期。 
- 在同一行上,单击**“更新”**。 - 动态数据将更新该数据库。如果您针对日期输入的是允许使用的值,那么,该数据将能够通过验证控件,该控件是前面所生成的字段模板的一部分。 
后续步骤
本演练已经阐释了 ASP.NET 动态数据的基本原理,以及如何向现有的 ASP.NET 网站中添加动态数据功能。在将动态数据功能集成到现有的 ASP.NET 网站中时,可以执行以下操作:
- 与基础数据库交互。动态数据在数据驱动应用程序中合并了一些关键功能,如创建、读取、更新和删除 (CRUD) 操作。 
- 显示和编辑数据字段,因为动态数据基于从数据库推断的信息选择适当的字段模板。 
您可能还想试验其他功能。建议研究的方面如下:
- 了解如何用最少的代码或不用代码来创建使用 ASP.NET 动态数据的基本 Web 应用程序。有关更多信息,请参见演练:使用基架创建新的动态数据网站。 
- 了解有关如何向数据控件中添加动态行为的更多信息。有关更多信息,请参见向 ASP.NET 数据绑定控件添加动态行为。 
- 了解有关如何在数据模型中自定义数据字段的外观和行为的更多信息。有关更多信息,请参见如何:在数据模型中自定义数据字段的外观和行为。 
- 了解有关如何在数据模型中自定义数据字段验证的更多信息。有关更多信息,请参见如何:在数据模型中自定义数据字段验证。 
有关一般信息,您可能希望进行以下工作:
- 了解如何在 Web 应用程序中使用 O/R 设计器创建表示 SQL Server 数据库的数据类。有关更多信息,请参见如何:在 Web 应用程序中创建 LINQ to SQL 类。 
- 了解 LINQ-to-SQL 对象关系映射。有关更多信息,请参见 LINQ to SQL。 
- 了解对象关系设计器(O/R 设计器)。有关更多信息,请参见对象关系设计器(O/R 设计器)。 
请参见
概念
修订记录
| 日期 | 修订历史记录 | 原因 | 
|---|---|---|
| 2008 年 7 月 | 新增主题。 | SP1 功能更改。 |