再接再厉VS 2008 sp1 + .NET 3.5 sp1(8) - Dynamic Data(动态数据)

[索引页]
[源码下载]


再接再厉VS 2008 sp1 + .NET 3.5 sp1(8) - Dynamic Data(动态数据)


作者: webabcd


介绍
以Northwind为示例数据库,演示Dynamic Data(动态数据)
  • MetaModel - 数据库和域对象之间的映射的抽象
  • MetaModel.RegisterContext() - 使用指定的配置上下文注册指定的数据上下文
  • Scaffold - 译为基架。即基于数据库架构(linq to sql 或 entity framework)生成网页模板的机制
  • ScaffoldTableAttribute(false) - 隐藏指定的表
  • ScaffoldColumn(false) - 隐藏指定的字段
  • MetadataTypeAttribute(Type metadataClassType) - 指定要与数据模型类关联的元数据类
  • DynamicField - 显示指定的动态数据字段,相当于 BoundField
  • DynamicControl - 通过指定的字段模板显示指定的动态数据字段


示例
全局配置
Global.asax
<% @ Application Language = " C# "   %>
<% @ Import Namespace = " System.Web.Routing "   %>
<% @ Import Namespace = " System.Web.DynamicData "   %>

< script runat = " server " >
    
    
public   static   void  RegisterRoutes(RouteCollection routes)
    
{
        MetaModel model 
= new MetaModel();

        
// MetaModel - 数据库和域对象之间的映射的抽象
        
// MetaModel.RegisterContext(Type contextType, ContextConfiguration configuration) - 使用指定的配置上下文注册指定的数据上下文
        
//     contextType - 数据模型中所定义的数据上下文类型
        
//     configuration - 相关的配置。其 ScaffoldAllTables 属性为是否要启用基架,基架就是基于数据库架构(linq to sql 或 entity framework)生成网页模板的机制
        model.RegisterContext(typeof(VS2008SP1.Business.NorthwindEntities), new ContextConfiguration() { ScaffoldAllTables = true });

        
// 下面的语句支持分页模式,在这种模式下,“列表”、“详细”、“插入”
        
// 和“更新”任务是使用不同页执行的。若要启用此模式,请取消注释下面
        
// 的 route 定义,并注释掉后面的合并页模式部分中的 route 定义。
        routes.Add(new DynamicDataRoute("{table}/{action}.aspx")
        
{
            Constraints 
= new RouteValueDictionary(new { action = "List|Details|Edit|Insert" }),
            Model 
= model
        }
);

        
// 下面的语句支持合并页模式,在这种模式下,“列表”、“详细”、“插入”
        
// 和“更新”任务是使用同一页执行的。若要启用此模式,请取消注释下面
        
// 的 routes,并注释掉上面的分页模式部分中的 route 定义。
        
// routes.Add(new DynamicDataRoute("{table}/ListDetails.aspx") {
        
//     Action = PageAction.List,
        
//     ViewName = "ListDetails",
        
//     Model = model
        
// });

        
// routes.Add(new DynamicDataRoute("{table}/ListDetails.aspx") {
        
//     Action = PageAction.Details,
        
//     ViewName = "ListDetails",
        
//     Model = model
        
// });
    }


    
void  Application_Start( object  sender, EventArgs e)
    
{
        RegisterRoutes(RouteTable.Routes);
    }


</ script >



1、数据驱动的 Web 应用程序
详见源代码中的DynamicDataSite项目。动态数据的目录结构详见MSDN
Scaffold.cs
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;

using  System.ComponentModel.DataAnnotations;
using  System.ComponentModel;

namespace  VS2008SP1.Business
{
    
/*
     * Scaffold - 译为基架。即基于数据库架构(linq to sql 或 entity framework)生成网页模板的机制
     * ScaffoldTableAttribute(false) - 隐藏指定的表
     * ScaffoldColumn(false) - 隐藏指定的字段
     * MetadataTypeAttribute(Type metadataClassType) - 指定要与数据模型类关联的元数据类
     
*/


    [ScaffoldTable(
false)]
    
public partial class Region
    
{
        
// Region 表不会被路由(显示)
    }


    [MetadataType(
typeof(Customers_Metadata))]
    
public partial class Customers
    
{
        
// 将 Customers 的元数据关联到 Customers_Metadata
    }


    
public class Customers_Metadata
    
{
        [ScaffoldColumn(
false)]
        
public object Phone;

        
// Phone 不会在 Customers 表中被显示
    }

}


Validation.cs
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;

using  System.ComponentModel.DataAnnotations;
using  System.ComponentModel;

namespace  VS2008SP1.Business
{
    [MetadataType(
typeof(Products_Metadata))]
    
public partial class Products
    
{
        
// entity framework 会自动生成类似 OnFieldChanging() 的部分方法
        
// 如果想做字段的自定义输入验证,则可以重写此方法
        partial void OnUnitPriceChanging(global::System.Nullable<decimal> value)
        
{
            
if (value > 1000)
            
{
                
throw new ValidationException("UnitPrice 不能大于 1000");
            }

        }

    }


    
public class Products_Metadata
    
{
        
// [DataType(DataType.EmailAddress)] // 指定要与数据字段关联的附加类型的名称
        
// [DisplayFormat()] // 格式化输出
        
// [Range()] // 指定字段的范围约束
        
// [RegularExpression()] // 正则表达式验证
        
// [StringLength()] // 字段的字符长度验证
        [Required()] // 必填
        [UIHint("MyDecimal")] // 使用名为 MyDecimal 的字段模板
        public object UnitPrice;

        [DisplayName(
"产品名称")] // 指定的字段所显示的名称。在动态数据中,查看 Products 表,其 header 将显示为 产品名称
        [StartsWith("webabcd", ErrorMessage = "{0} 必须以 {1} 开头")] // 应用自定义 ValidationAttribute
        public object ProductName getset; }

    }



    
// 编写一个自定义 ValidationAttribute,验证指定字段是否是以指定的字符串开头
    [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
    
sealed public class StartsWithAttribute : ValidationAttribute
    
{
        
readonly string _param;

        
/// <summary>
        
/// 构造函数
        
/// </summary>
        
/// <param name="param">指定的开头字符串</param>

        public StartsWithAttribute(string param)
        
{
            _param 
= param;
        }


        
/// <summary>
        
/// 是否通过验证
        
/// </summary>
        
/// <param name="value">输入值</param>
        
/// <returns></returns>

        public override bool IsValid(object value)
        
{
            
return ((string)value).ToLower().StartsWith(this._param.ToLower());
        }


        
/// <summary>
        
/// 格式化错误信息
        
/// </summary>
        
/// <param name="name">指定的字段名</param>
        
/// <returns></returns>

        public override string FormatErrorMessage(string name)
        
{
            
return string.Format(ErrorMessageString, name, this._param);
        }

    }

}



2、以 Products 表为例,演示动态数据的应用
MyProducts.aspx
<% @ Page Language="C#" MasterPageFile="~/Site.master" CodeFile="MyProducts.aspx.cs"
    Inherits
="MyProducts" Title="以 Products 表为例,演示动态数据的应用" 
%>

<% @ Register Assembly="System.Web.Entity, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
    Namespace
="System.Web.UI.WebControls" TagPrefix="asp" 
%>
< asp:Content  ID ="Content1"  ContentPlaceHolderID ="ContentPlaceHolder1"  runat ="Server" >
    
< asp:DynamicDataManager  ID ="DynamicDataManager1"  runat ="server"  AutoLoadForeignKeys ="true"   />
    
< h2 >
        以 Products 表为例,演示动态数据的应用
</ h2 >
    
< asp:FormView  ID ="FormView1"  runat ="server"  DataSourceID ="FormDataSource"  AllowPaging ="True"
        DataKeyNames
="ProductId" >
        
< ItemTemplate >
            
< table >
                
< tr >
                    
< td >
                        ProductId:
                    
</ td >
                    
< td >
                        
<!-- DynamicField - 显示指定的动态数据字段,相当于 BoundField -->
                        
<!-- DynamicControl - 通过指定的字段模板显示指定的动态数据字段 -->
                        
< asp:DynamicControl  ID ="ProductId"  runat ="server"  DataField ="ProductId"   />
                    
</ td >
                
</ tr >
                
< tr >
                    
< td >
                        ProductName:
                    
</ td >
                    
< td >
                        
< asp:DynamicControl  ID ="ProductName"  runat ="server"  DataField ="ProductName"   />
                    
</ td >
                
</ tr >
                
< tr >
                    
< td >
                        UnitPrice:
                    
</ td >
                    
< td >
                        
< asp:DynamicControl  ID ="UnitPrice"  runat ="server"  DataField ="UnitPrice"   />
                    
</ td >
                
</ tr >
                
< tr >
                    
< td  colspan ="2" >
                        
< asp:LinkButton  ID ="InsertButton"  runat ="server"  CommandName ="New"  CausesValidation ="false"
                            Text
="New"   />
                        
< asp:LinkButton  ID ="EditButton"  runat ="server"  CommandName ="Edit"  CausesValidation ="false"
                            Text
="Edit"   />
                        
< asp:LinkButton  ID ="DeleteButton"  runat ="server"  CommandName ="Delete"  CausesValidation ="false"
                            Text
="Delete"   />
                    
</ td >
                
</ tr >
            
</ table >
        
</ ItemTemplate >
        
< EditItemTemplate >
            
< table >
                
< tr >
                    
< td >
                        ProductId:
                    
</ td >
                    
< td >
                        
< asp:DynamicControl  ID ="ProductId"  runat ="server"  DataField ="ProductId"  Mode ="ReadOnly"   />
                    
</ td >
                
</ tr >
                
< tr >
                    
< td >
                        ProductName:
                    
</ td >
                    
< td >
                        
<!--
                            UIHint - 指定字段模板,此例的字段模板会以黄色背景显示数据
                            Mode - 设置呈现模式 [System.Web.UI.WebControls.DataBoundControlMode 枚举] 
                                DataBoundControlMode.ReadOnly - 只读模式。默认值
                                DataBoundControlMode.Edit - 编辑模式
                                DataBoundControlMode.Insert - 插入模式
                        
-->
                        
< asp:DynamicControl  ID ="ProductName"  runat ="server"  DataField ="ProductName"  Mode ="Edit"
                            UIHint
="YelloText"   />
                    
</ td >
                
</ tr >
                
< tr >
                    
< td >
                        UnitPrice:
                    
</ td >
                    
< td >
                        
< asp:DynamicControl  ID ="UnitPrice"  runat ="server"  DataField ="UnitPrice"  Mode ="Edit"   />
                    
</ td >
                
</ tr >
                
< tr >
                    
< td  colspan ="2" >
                        
< asp:LinkButton  ID ="UpdateButton"  runat ="server"  CommandName ="Update" > Update </ asp:LinkButton >
                        
< asp:LinkButton  ID ="CancelEditButton"  runat ="server"  CommandName ="Cancel"  CausesValidation ="false" > Cancel </ asp:LinkButton >
                    
</ td >
                
</ tr >
            
</ table >
        
</ EditItemTemplate >
        
< InsertItemTemplate >
            
< table >
                
< tr >
                    
< td >
                        ProductName:
                    
</ td >
                    
< td >
                        
< asp:DynamicControl  ID ="ProductName"  runat ="server"  DataField ="ProductName"  Mode ="Insert"   />
                    
</ td >
                
</ tr >
                
< tr >
                    
< td  colspan ="2" >
                        
< asp:LinkButton  ID ="InsertButton"  runat ="server"  CommandName ="Insert"  Text ="Insert"   />
                        
< asp:LinkButton  ID ="CancelInsertButton"  runat ="server"  CommandName ="Cancel"  CausesValidation ="false"
                            Text
="Cancel"   />
                    
</ td >
                
</ tr >
            
</ table >
        
</ InsertItemTemplate >
        
< PagerSettings  Position ="Bottom"  Mode ="NumericFirstLast"   />
    
</ asp:FormView >
    
< asp:EntityDataSource  ID ="FormDataSource"  runat ="server"  ConnectionString ="name=NorthwindEntities"
        DefaultContainerName
="NorthwindEntities"  EntitySetName ="Products"  ContextTypeName ="VS2008SP1.Business.NorthwindEntities"
        EnableInsert
="True"  EnableUpdate ="True"  EnableDelete ="True" >
    
</ asp:EntityDataSource >
</ asp:Content >


OK
[源码下载]

你可能感兴趣的:(dynamic)