摘要:ASP.NET 3.5 Extensions: Dynamic Data Web Site 要點整理
在前面的練習當 中,很多地方都是由專案範本、IDE、以及 Dynamic Data 框架幫我們處理掉,我們就只是用滑鼠拖拉幾下,再到 web.config 中設定一下屬性就完成了。即使做了練習,可能還會有一點知其然不知其所以然的感覺:為什麼這樣網站就可以 run 了?其中各個環節是怎麼串起來的?因此,這裡簡短地將前面練習過程中幾個要點整理一下,希望能讓 Dynamic Data Web Site 的拼圖更完整。
以下就分別針對建立 Dynamic Data Web Site 的過程,以及網頁客製化的部份分別整理其重點。
關於建立 Dynamic Data Web Site 的幾個重點
- 若要迅速建立一個具備增刪改查的資料維護網站,可用 VS2008 直接 New 一個 Dynamic Data Web Site(當然你必須先安裝 ASP.NET 3.5 Extensions preview 版)。透過此方式建立的網站,主要是運用 Dynamic Data 的 scaffolding 功能。
- Dynamic Data Web Site 專案範本會自動產生相關的樣板網頁及樣式,包括一個可瀏覽資料表清單的首頁(Default.aspx)。當然,它不會知道你想要處理哪些資料表,因此這 部份的空白須由你來填補。說得更明白些,就是要建立 Data Context 類別。Data Context 類別有點像是一個資料庫,裡面包含許多類別,而每個類別都是對應到實體資料庫中的一個資料表。
- 建立 Data Context 類別的方法,是在專案中加入一個 LINQ to SQL class。若將它命名為 Foo.dbml,那麼除了產生 Foo.dbml(這是個 XML 檔案),還會產生 Foo.dbml.layout 以及 Foo.designer.cs,前者只存放設計檢視的畫面編排資訊,後者才包含真正的 Data Context 類別,而其類別名稱會是 FooDataContext。你從 Server Explorer 中拖到 .Foo.dbml 設計區域的那些資料表,IDE 都會幫你在 .designer.cs 中建立對應的類別。換句話說,IDE 和 Dynamic Data 框架自動幫你處理了物件/關聯對應(object-relation mapping)的繁瑣工作。
- 當你瀏覽 Default.aspx 時,Dynamic Data 框架會去你指定的 Data Context 類別中取得資料表清單及其欄位資料。那麼如何告訴 Dynamic Data 框架該使用哪個 Data Context 類別?答案是 Web.config 裡面的 <dynamicData> 元素的 dataContextType 屬性。
網頁客製化
- 維護資料表的樣板網頁放在 App_Shared\DynamicDataPages 目錄下,共有三個檔案:ListTemplate.aspx、DetailsTemplate.aspx、以及 ListDetailstemplate.aspx。當你在網站首頁(Default.aspx)點擊某個資料表連結,Dynamic Data 框架就會使用這些樣板來呈現資料表的欄位資料。
- 若要客製化資料表維護網頁,可將上述的樣板網頁複製到網站根目錄下的特定資料夾,並將檔名中的 "Template" 去除。所謂的特定資料夾,指的是該資料夾名稱必須跟資料表名稱一樣。例如,想要自訂 Customers 資料表的維護頁面,就可以在網站根目錄下建立名為 Customers 的資料夾,然後將樣板檔複製到該資料夾下,再修改它們。從 web.config 中的 <dynamicData> 元素的 <mappings> 子元素的 patterns 屬性可看出資料夾命名的規則,以及其名稱與瀏覽網站時的 URI 有何關聯。
- 你可以在自訂網頁中使用 <DynamicField> 標籤來定義該資料表維護頁面要有哪些欄位,以及各欄位的顯示樣式、欄位標題(HeaderText 屬性)、欄位的顯示/編輯控制項(RenderHint 屬性)。
自訂欄位驗證
- ASP.NET 3.5 Extensions 內建三個欄位驗證特徵項 (validation attributes),可用來套用至特定欄位,它們是:RequiredAttribute、RegexAttribute、以及 RangeAttribute。
- 套用欄位驗證特徵項的方法:先在 App_Code 資料夾中建立一個對應某 entity class 的 partial 類別(如第一篇的 Customer.cs),然後將驗證特徵項套用至類別。參考以下範例:
using System.Web.DynamicData;
[Required("CustomerID", ErrorMessage="客戶編號不可空白!")]
public partial class Customer
{
}
- 除了內建的驗證特徵項,開發人員也可以自訂其他驗證規則,做法是在自訂的 entity class 中「實作」On<FieldName>Changing 方法。這裡的「實作」須用到 partial methods 語法。參考以下範例:
public partial class Customer
{
partial void OnCustomerIDChanging(string value)
{
if (String.IsNullOrEmpty(value))
{
throw new Exception("客戶編號不可空白!");
}
}
}
自訂欄位顯示/編輯控制項
- ASP.NET Dynamic Data 框架會根據欄位型態自動使用內建的控制項來顯示及編輯欄位值,例如:文字類型的欄位就會使用 TextBox。這些顯示/編輯欄位的控制項叫做「動態資料欄位」(dynamic data fields),它們都是 user controls。你可以在網站的 App_Shared\DynamicDataFields 資料夾中找到這些內建的動態資料欄位控制項。
- 你也可以自行設計動態資料欄位控制項,以補內建動態資料欄位控制項之不足。作法是在 App_Shared\DynamicDataFields 資料夾上點右鍵,Add New Item,然後選擇 "Dynamic Data Field"。此方式會幫你產生兩個 user controls,一個用來顯示欄位值,一個用來編輯欄位值,而且它們都是 single file 的寫法(而非 code-behind 寫法)。
- 動態資料欄位控制項必須繼承自父類別:System.Web.DynamicData.FieldTemplateUserControlBase。
- 設計好動態資料欄位控制項之後,可利用 RenderHint 屬性來指定某個欄位要用你自己撰寫的控制項來顯示和編輯,作法有兩種:
(1) 在自訂網頁(如前例的 Customers\ListDetails.aspx)中指定 <DynamicField> 標籤的 RenderHint 屬性。如下所示:
<asp:DynamicField DataField="OrderDate" HeaderText="訂單日期" RenderHint="CalendarDate" />
(2) 在自訂 entity class 中套用 RenderHint 特徵項,如下所示:
[RenderHint("OrderDate", "CalendarDate")]
public partial class Order
{
}
其中第一個參數是欄位名稱,第二個參數就是你的動態資料欄位控制項類別名稱。
OK! 有關 Dynamic Data Web site 的部分就先整理到這邊。