VS 2008 sp1 + .NET 3.5 sp1(8) - Dynamic Data(動態資料)

iDotNetSpace發表於2009-02-23

介紹
以Northwind為示例資料庫,演示Dynamic Data(動態資料)
MetaModel - 資料庫和域物件之間的對映的抽象
MetaModel.RegisterContext() - 使用指定的配置上下文註冊指定的資料上下文
Scaffold - 譯為基架。即基於資料庫架構(linq to sql 或 entity framework)生成網頁模板的機制
ScaffoldTableAttribute(false) - 隱藏指定的表
ScaffoldColumn(false) - 隱藏指定的欄位
MetadataTypeAttribute(Type metadataClassType) - 指定要與資料模型類關聯的後設資料類
DynamicField - 顯示指定的動態資料欄位,相當於 BoundField
DynamicControl - 通過指定的欄位模板顯示指定的動態資料欄位


示例
全域性配置
Global.asax




   
    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);
    }

 


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 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 { get; set; }

    }


    // 編寫一個自定義 ValidationAttribute,驗證指定欄位是否是以指定的字串開頭
    [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
    sealed public class StartsWithAttribute : ValidationAttribute
    {
        readonly string _param;

        /**////


        /// 建構函式
        ///

        /// 指定的開頭字串
        public StartsWithAttribute(string param)
        {
            _param = param;
        }

        /**////


        /// 是否通過驗證
        ///

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

        /**////


        /// 格式化錯誤資訊
        ///

        /// 指定的欄位名
        ///
        public override string FormatErrorMessage(string name)
        {
            return string.Format(ErrorMessageString, name, this._param);
        }
    }
}

 

2、以 Products 表為例,演示動態資料的應用
MyProducts.aspx

    Inherits="MyProducts" Title="以 Products 表為例,演示動態資料的應用" %>

    Namespace="System.Web.UI.WebControls" TagPrefix="asp" %>

   
   


        以 Products 表為例,演示動態資料的應用


            DataKeyNames="ProductId">
       
           
               
                   
                   
               
               
                   
                   
               
               
                   
                   
               
               
                   
               
           

                        ProductId:
                   

                        <!--DynamicField - 顯示指定的動態資料欄位,相當於 BoundField--&gt
                        <!--DynamicControl - 通過指定的欄位模板顯示指定的動態資料欄位--&gt
                       
                   

                        ProductName:
                   

                       
                   

                        UnitPrice:
                   

                       
                   

                                                    Text="New" />
                                                    Text="Edit" />
                                                    Text="Delete" />
                   

       

       
           
               
                   
                   
               
               
                   
                   
               
               
                   
                   
               
               
                   
               
           

                        ProductId:
                   

                       
                   

                        ProductName:
                   

                        <!--
                            UIHint - 指定欄位模板,此例的欄位模板會以黃色背景顯示資料
                            Mode - 設定呈現模式 [System.Web.UI.WebControls.DataBoundControlMode 列舉]
                                DataBoundControlMode.ReadOnly - 只讀模式。預設值
                                DataBoundControlMode.Edit - 編輯模式
                                DataBoundControlMode.Insert - 插入模式
                        --&gt
                                                    UIHint="YelloText" />
                   

                        UnitPrice:
                   

                       
                   

                        Update
                        Cancel
                   

       

       
           
               
                   
                   
               
               
                   
               
           

                        ProductName:
                   

                       
                   

                       
                                                    Text="Cancel" />
                   

       

       
   

            DefaultContainerName="NorthwindEntities" EntitySetName="Products" ContextTypeName="VS2008SP1.Business.NorthwindEntities"
        EnableInsert="True" EnableUpdate="True" EnableDelete="True">
   


 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-557466/,如需轉載,請註明出處,否則將追究法律責任。

相關文章