asp.net|控制項|資料 模板化資料繫結控制項提供在頁中呈現資料的最大靈活性。您可以回想一下 ASP.NET 1.x 版中的幾個樣板化控制項,如 DataList 和 重複器控制項。ASP.NET 2.0 繼續支援這些控制項,但在此版本中,在模板中對控制項進行資料繫結的方式已得到簡化和改進。本部分討論在資料繫結控制項模板中進行資料繫結的各種方式。 <%# Container.DataItem(“Name”) %>
<%# Container.DataItem(“Department”) %>
<%# DataBinder.Eval(
Container.DataItem, “HireDate”, “{0:mm dd yyyy}”) %>
現在不需要上面那麼麻煩了,下面的是最簡單的綁定文法:
<%# Eval(“Name”) %>
<%# Bind(“Name”) %>
<%# Eval(“HireDate”, “{0:mm dd yyyy}” ) %>
當然,以前的綁定文法在.net2.0中還是可以用的。
對於XML資料繫結的文法又與上面的有點不一樣了
當使用XMLDataSource控制項的時候,綁定的文法如下:
<% XPathBinder.Eval(Container.DataItem, “employees/employee/Name”) %>
簡便的方法如下:
<% XPath(“employees/employee/Name”) %>
格式化的和平常的綁定也是一樣的:
<% XPath(“employees/employee/HireDate”, “{0:mm dd yyyy}”) %>
以上都是返回單獨的結點的文法,當想要得到多個結點時,文法又不同了:
<% XPathBinder.Select(Container.DataItem,”employees/employee”) %>
<% XpathSelect(“employees/employee”) %>
資料繫結運算式
ASP.NET 2.0 改進了模板中的資料繫結,將資料繫結文法由完整的 v1.x 文法 DataBinder.Eval(Container.DataItem, fieldname) 簡化為 Eval(fieldname)。與 DataBinder.Eval 一樣,Eval 方法也接受一個可選的 formatString 參數。縮寫的 Eval 文法與 DataBinder.Eval 的不同之處,在於 Eval 根據最近的容器物件(在上面的樣本中為 DataListItem)的 DataItem 屬性自動解析欄位,而 DataBinder.Eval 接受該容器的一個參數。因此,Eval 僅在資料繫結控制項的模板中使用,而不能在“頁”層級使用。當然,ASP.NET 2.0 頁繼續支援 DataBinder.Eval,因此它可用於簡化的 Eval 文法不受支援的場合。
<asp:DataList DataSourceID="ObjectDataSource1" runat="server"> <ItemTemplate> <asp:Image ImageUrl='<%# Eval("FileName", "images/thumbs/{0}") %>' runat="server"/> <asp:Label Text='<%# Eval("Caption") %>' runat="server"/> </ItemTemplate></asp:DataList>
下面的樣本示範新的簡化 Eval 資料繫結文法在 DataList ItemTemplate 中綁定 Image、Label 和 HyperLink 控制項。
C# DataBinding in a DataList Template
資料繫結還可以包含為控制項主題定義的一部分,這樣,只需更改所應用的主題即可顯著改變樣板化控制項的布局和外觀。但在 Theme 模板中只能使用 Eval(或後面將討論的 Bind)。不能隨意綁定到使用者代碼。下一樣本示範應用於上一樣本為照片頁建立完全不同外觀的主題。有關主題的更多資訊,請參考本教程的“應用樣式、主題和外觀”部分。
C# DataBinding in a DataList Template (Themed)
FormView 控制項
DataList 控制項逐一查看資料來源的每個資料項目,為每一項輸出一次 ItemTemplate。這對於呈現項列表十分有用,但通常需要根據表單中的單個資料項目進行資料繫結。因此,ASP.NET 2.0 引入了 FormView 控制項,該控制項在任意形式的模板中一次呈現單個資料項目。DetailsView 和 FormView 之間的主要差異在於 DetailsView 具有內建的表格呈現方式,而 FormView 需要使用者定義的模板用於呈現。FormView 和 DetailsView 物件模型在其他方面非常類似。下面的樣本示範一個綁定到 ObjectDataSource 的 FormView 控制項。與前面的 DataList 樣本一樣,FormView 的 ItemTemplate 屬性包含資料繫結 Image、Label 和 HyperLink。
C# DataBinding in a FormView Template
和 DetailsView 相似,FormView 跟蹤當前呈現的項,並可選擇在資料來源返回列表時支援對多個資料項目進行分頁。下面的樣本示範一個啟用了分頁功能的 FormView。
C# DataBinding in a FormView Template (Paged)
雙向資料繫結
與 DetailsView 控制項一樣,FormView 通過其關聯的資料來源控制項支援自動 Update、Insert 和 Delete 操作。若要定義編輯或插入操作的輸入 UI,可在定義 ItemTemplate 的同時定義 EditItemTemplate 或 InsertItemTemplate。在本模板中,您將對輸入控制項(如 TextBox、CheckBox 或 DropDownList)進行資料繫結,以綁定到資料來源的欄位。但是,這些模板中的資料繫結使用“雙向”資料繫結文法,從而允許 FormView 從模板中提取輸入控制項的值,以便傳遞到資料來源。這些資料繫結使用新的 Bind(fieldname) 文法而不是 Eval。
重要事項: 使用 Bind 文法進行資料繫結的控制項必須設定有 ID 屬性。
<asp:FormView DataSourceID="ObjectDataSource1" DataKeyNames="PhotoID" runat="server"> <EditItemTemplate> <asp:TextBox ID="CaptionTextBox" Text='<%# Bind("Caption") %>' runat="server"/> <asp:Button Text="Update" CommandName="Update" runat="server"/> <asp:Button Text="Cancel" CommandName="Cancel" runat="server"/> </EditItemTemplate> <ItemTemplate> <asp:Label Text='<%# Eval("Caption") %>' runat="server" /> <asp:Button Text="Edit" CommandName="Edit" runat="server"/> </ItemTemplate></asp:FormView>
在對 GridView 或 DetailsView 執行更新或插入操作時,如果該控制項的列或欄位定義了 BoundField,GridView 或 DetailsView 負責建立 Edit 或 Insert 模式中的輸入 UI,以便它能自動提取這些輸入值以傳遞迴資料來源。由於模板包含任意的使用者定義的 UI 控制項,因此,需要使用雙向資料繫結文法,這樣 FormView 等樣板化控制項才能知道應從模板中提取哪些控制項值以用於更新、插入或刪除操作。在 EditItemTemplate 中仍然可以使用 Eval 文法進行不傳遞迴資料來源的資料繫結。另請注意,FormView 與 DetailsView 和 GridView 一樣,支援使用 DataKeyNames 屬性保留主鍵欄位(即使這些欄位並未呈現)的原始值以傳遞迴更新/插入操作。
FormView 支援使用 DefaultMode 屬性指定要顯示的預設範本,但在預設情況下,FormView 以 ReadOnly 模式啟動並呈現 ItemTemplate。若要啟用用於從 ReadOnly 模式轉換為 Edit 或 Insert 模式的 UI,可以向模板添加一個 Button 控制項,並將其 CommandName 屬性設定為 Edit 或 New。可以在 EditItemTemplate 內添加 CommandName 設定為 Update 或 Cancel 的按鈕,以用於提交或中止更新操作。類似地,也可以添加 CommandName 設定為 Insert 或 Cancel 的按鈕,以用於提交或中止插入操作。
下面的樣本示範一個定義了 ItemTemplate 和 EditItemTemplate 的 FormView。ItemTemplate 包含使用 Eval(單向)綁定的控制項,而 EditItemTemplate 包含一個使用 Bind 語句雙向繫結的 TextBox 控制項。主鍵欄位 (PhotoID) 是使用 DataKeyNames 屬性在檢視狀態中進行往返的。FormView 包含用於在其模板之間進行切換的命令按鈕。
C# Two-Way Databinding in a FormView Edit Template
通過使用添加到 Columns 或 Fields 集合的 TemplateField,GridView 和 DetailsView 還支援模板化 UI。TemplateField 支援使用 ItemTemplate、EditItemTemplate 和 InsertItemTemplate(僅 DetailsView)指定這些控制項的不同呈現模式中的欄位 UI。與上面的 FormView 樣本一樣,EditItemTemplate 或 InsertItemTemplate 中的雙向繫結允許 GridView 或 DetailsView 從這些模板中的控制項提取值。TemplateField 的常見用途是向 EditItemTemplate 添加驗證程式控制項,用於 GridView 或 DetailsView 操作的聲明性驗證。下面的樣本示範這種方法的一個樣本。有關 ASP.NET 中可用的驗證控制項的更多資訊,請參考本教程的“驗證表單輸入控制項”部分。
C# Validation in a GridView Edit Template
TemplateField 的另一個用途是自訂輸入控制項,這種控制項用於輸入 GridView 或 DetailsView 列/欄位值。例如,可以將 DropDownList 控制項放在 TemplateField 的 EditItemTemplate 中,以允許從預定義的值列表進行選擇。下面的樣本示範這種方法。注意,本例中的 DropDownList 與它自己的資料來源控制項進行了資料繫結,以便動態地擷取該列表的值。
C# DropDownList in a GridView Edit Template