更新:2007 年 11 月
本主题介绍如何通过创建您自己的字段模板在 ASP.NET 动态数据中自定义数据字段(表列)的显示。本主题所描述的任务包括:
- 创建自定义字段模板来自定义数据字段的显示。 
- 将自定义字段模板与数据字段关联。这样可以在数据字段和自定义字段模板之间建立数据模型连接以处理显示。 .gif) 说明: 说明:- 使用数据模型自定义数据字段显示时,自定义项适用于整个网站。这意味着动态数据使用自定义字段模板代替默认模板(根据数据字段类型选择)来显示数据字段。 
创建自定义字段模板
- 在**“解决方案资源管理器”中,右击 DynamicData/FieldTemplates 文件夹,然后单击“添加新项”**。 
- 在**“已安装的模板”下单击“字段模板”**。 - 在**“名称”框中输入控件的名称;可以使用任何名称。请确保选中“将代码放在单独的文件中”**框。 
- 切换至或打开刚刚创建的用户控件文件。 
- 在 @ Control 指令中,添加一个引用代码隐藏文件的 CodeFile 属性和一个引用控件类的 Inherits 属性。 - <%@ Control Language="C#" CodeFile=MyCustomControl.ascx.cs" Inherits="MyCustomControl" %>- <%@ Control Language="VB" CodeFile=MyCustomControl.ascx.cs" Inherits="MyCustomControl" %>
- 创建将为显示数据而呈现的标记。 - 下面的示例演示 Label 控件,该控件的 Text 属性设置为当前字段值字符串,OnDataBinding 属性设置为自定义事件处理程序。 - <asp:Label id="TextLabel1" runat="server" OnDataBinding="DataBindingHandler" Text='<%# FieldValueString %>'> </asp:Label>
- 保存并关闭用户控件文件。 
- 打开用户控件代码隐藏文件。 
- 使用 Imports 关键字(在 Visual Basic 中)或 using 关键字(在 Visual C# 中),添加引用 System.Web.DynamicData 的命名空间指令。 - using System.Web.DynamicData;- Imports System.Web.DynamicData
- 从 FieldTemplateUserControl 类派生用户控件分部类,如下所示。 - partial class MyCustomControl: FieldTemplateUserControl- { } - Public Partial Class MyCustomControl Inherits _ FieldTemplateUserControl End Class
- 若要自定义控件显示数据字段的方式,请处理用户控件的 OnDataBinding 事件。在处理程序中,可以从控件的 FieldValue 属性中获取当前数据字段的值,并相应地自定义显示。 - 下面的示例演示如何处理 OnDataBinding 事件。 - public void DataBindingHandler(object sender, EventArgs e) { // Define the understocked threshold. short underStockedThreshold = 150; // Get the current number of items in stock. short currentValue = (short)FieldValue; // Check product stock. if (currentValue < underStockedThreshold) { // Customize display here. For example you show the data with //a red background. } }- Public Sub DataBindingHandler(ByVal sender As Object, _ ByVal e As EventArgs) ' Define the understocked threshold. Dim underStockedThreshold As Short = 150 ' Get the current number of items in stock. Dim currentValue As Short = DirectCast(FieldValue, Short) ' Check product stock. If currentValue < underStockedThreshold Then 'Customize display here. For example you show the data with 'a red background. End If End Sub
- 关闭用户控件代码隐藏文件。此时已创建一个自定义字段模板。 
将自定义字段模板与数据字段关联
- 在**“解决方案资源管理器”中,右击 App_Code 文件夹,然后单击“添加新项”**。 
- 在**“已安装的模板”下单击“类”**。 - 在**“名称”**框中,输入数据库表的名称,该表中包含自定义字段模板要显示的数据。 - 例如,如果自定义控件将显示 Products 表中的数据,则文件名为 Products.cs 或 Product.vb,类名为 Product。此文件还将包含一个辅助类,利用该辅助类可以自定义数据字段的显示。 
- 切换至或打开刚刚创建的类文件。 
- 将 Partial 关键字(在 Visual Basic 中)或 partial 关键字(在 Visual C# 中)添加到类定义中,使其成为分部类。 
- 使用 Imports 关键字(在 Visual Basic 中)或 using 关键字(在 Visual C# 中),添加引用 System.Web.DynamicData 和 System.ComponentModel.DataAnnotations 的命名空间指令。 - using System.Web.DynamicData; using System.ComponentModel.DataAnnotations;- Imports System.Web.DynamicData Imports System.ComponentModel.DataAnnotations
- 将 MetadataTypeAttribute 属性添加到分部类定义。此属性的参数是为了处理数据字段显示自定义而将要创建的辅助元数据类的名称。 - [MetadataType(typeof(ProductMetadata))] public partial class Product { }- <MetadataType(GetType(ProductMetadata))> _ Public Partial Class Product End Class
- 创建一个将充当辅助元数据类的类。可以对该类使用任何名称,但类名必须与上一步在 MetadataTypeAttribute 属性中引用的名称匹配。 
- 在元数据类中,创建一个其名称与要显示的数据字段相对应的字段。使用 UIHintAttribute 属性标记该字段,并指定用于显示的自定义字段模板的名称。 - 辅助类的唯一目的就是提供一个定义 UIHintAttribute 属性的位置,这样就不必向该类中添加任何其他代码。 - 下面的示例演示包含单个字段(带有 UIHintAttribute 属性)的元数据类的完整定义,该字段定义 UnitsInStock 字段的自定义显示。 - public class ProductMetadata [UIHint("UnitsInStock")] public object UnitsInStock; }- Public Class ProductMetadata <UIHint("UnitsInStock")> _ Public UnitsInStock As Object End Class
示例
下面的示例显示一个检查产品库存级别的自定义字段模板。如果产品库存不足,则字段模板使用红色前景色来显示值。
<%@ Control Language="VB" CodeFile="UnitsInStock.ascx.vb" 
Inherits="DynamicData_FieldTemplates_UnitsInStock" %>
<asp:Label id="TextLabel1" OnDataBinding="DataBindingHandler"
Text='<%# FieldValueString %>' runat="server"></asp:Label>
<%@ Control Language="C#" CodeFile="UnitsInStock.ascx.cs" 
Inherits="DynamicData_FieldTemplates_UnitsInStock" %>
<asp:Label id="TextLabel1" OnDataBinding="DataBindingHandler"
Text='<%# FieldValueString %>' runat="server"></asp:Label>
Imports System.Web.DynamicData
Partial Public Class DynamicData_FieldTemplates_UnitsInStock
    Inherits FieldTemplateUserControl
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
    End Sub
    ' DataBinding event handler.
    Public Sub DataBindingHandler(ByVal sender As Object, _
                                  ByVal e As EventArgs)
        ' Define product understocked threshold.
        Dim underStockedThreshold As Short = 150
        ' Get the current number of items in stock.
        Dim currentValue As Short = DirectCast(FieldValue, Short)
        ' Check product stock. 
        If currentValue < underStockedThreshold Then
            ' The product is understocked, set its 
            ' foreground color to red.
            TextLabel1.ForeColor = System.Drawing.Color.Red
        End If
    End Sub
End Class
using System.Web.DynamicData;
public partial class DynamicData_FieldTemplates_UnitsInStock :  FieldTemplateUserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }
    // DataBinding event handler.
    public void DataBindingHandler(object sender, EventArgs e)
    {
        // Define product understocked threshold.
        short underStockedThreshold = 150;
        // Get the current number of items in stock.
        short currentValue = (short)FieldValue;
        // Check product stock. 
        if (currentValue < underStockedThreshold)
        {
            // The product is understocked, set its 
            // foreground color to red.
            TextLabel1.ForeColor = System.Drawing.Color.Red;
        }
    }
}
编译代码
- 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)安装正确版本的示例数据库。 
- 动态数据网站。这允许您为数据库创建数据上下文,以及创建包含要自定义的数据字段和要重写的方法的类。此外,它还将创建要在其中使用上述页面的环境。有关更多信息,请参见演练:使用基架创建新的动态数据网站。