
数据绑定服务器控件
数据绑定概述和语法
asp.net 引入了新的声明性数据绑定语法。这种很灵活的语法允许研发人员不但能够绑定到数据源,而且能够绑定到简单属性、集合、表达式甚至是从方法调用返回的结果。下表显示了新语法的一些示例。
简单属性 customer: <%# custid %>
集合 orders: runat="server">
表达式 contact: <%# ( customer.first name + " " + customer.lastname ) %>
方法结果 outstanding balance: <%# getbalance(custid) %>
尽管该语法看起来和 asp 的 response.write 快捷方式 <%= %> 相似,但其行为完全不同。asp response.write 快捷方式语法在处理页时计算,而 asp.net 数据绑定语法仅在调用 databind 方法时计算。
databind 是页和任何服务器控件的方法。当在父控件上调用 databind 时,他级联到该控件的任何子控件。例如,datalist1.databind() 将因此对 datalist 模板中的每一控件调用 databind 方法。在页上调用 databind ? page.databind() 或只是 databind() ? 会导致计算页上的任何数据绑定表达式。通常从 page_load 事件调用 databind,如下例所示。
protected void page_load(object src, eventargs e) {
databind();
}
protected sub page_load(src as object, e as eventargs)
databind()
end sub
protected function page_load(src:object, e:eventargs) : void {
databind();
}
假如绑定表达式在运行时计算为预期的数据类型,则能够在 .aspx 页的声明节中的几乎任何位置使用绑定表达式。上面的简单属性、表达式和方法示例在计算时向用户显示文本。这些情况下,数据绑定表达式必须计算为 string 类型的值。在集合示例中,数据绑定表达式计算为 listbox 的 datasource 属性的有效类型值。您可能会发现有必要转换绑定表达式中的类型值以产生所需的结果。例如,假如 count 是整数:
number of records: <%# count.tostring() %>
绑定到简单属性
asp.net 数据绑定语法支持绑定到公共变量、页的属性和页上其他控件的属性。
下面的示例说明怎样绑定到公共变量和页上的简单属性。注意这些值在 databind() 调用前初始化。
到页属性的数据绑定
下面的示例说明怎样绑定到另一控件的属性。
到另一个服务器控件的属性的数据绑定
绑定到集合和列表
像 datagrid、listbox 和 htmlselect 这样的列表服务器控件将集合用作数据源。下面的示例说明怎样绑定到通常的公共语言运行库集合类型。这些控件只能绑定到支持 ienumerable、icollection 或 ilistsource 接口的集合。最常见的是绑定到 arraylist、hashtable、dataview 和 datareader。
下面的示例说明怎样绑定到 arraylist。
数据绑定 dropdownlist
下面的示例说明怎样绑定到 dataview。注意 dataview 类在 system.data 命名空间中定义。
<%@ import namespace="system.data" %>
到 dataview 的数据绑定
下面的示例说明怎样绑定到 hashtable。
到哈希表的数据绑定
绑定表达式或方法
通常需要在绑定到页或控件之前操作数据。下面的示例说明怎样绑定到表达式和方法的返回值。
到方法和表达式的数据绑定
databinder.eval
asp.net 框架提供了一种静态方法,计算后期绑定的数据绑定表达式并且可选择将结果格式化为字符串。databinder.eval 很方便,因为他消除了研发人员为强迫将值转换为所需的数据类型而必须做的许多显式转换。这在数据绑定模板列表内的控件时尤其有用,因为通常数据行和数据字段的类型都必须转换。
请看下面的示例,本例中整数将显示为货币字符串。使用标准的 asp.net 数据绑定语法,必须首先转换数据行的类型以便检索数据字段 integervalue。下一步,将此作为参数传递给 string.format 方法。
<%# string.format("{0:c}", ((datarowview)container.dataitem)["integervalue"]) %>
<%# string.format("{0:c}", (ctype(container.dataitem, datarowview)("integervalue"))) %>
<%# string.format("{0:c}", (datarowview(container.dataitem))["integervalue"]) %>
c# vb jscript
该语法可能比较复杂,难以记忆。相反,databinder.eval 只是个具备三个参数的方法:数据项的命名容器、数据字段名和格式字符串。在像 datalist、datagrid 或 repeater 这样的模板列表中,命名容器始终是 container.dataitem。page 是另一个可和 databinder.eval 一起使用的命名容器。
<%# databinder.eval(container.dataitem, "integervalue", "{0:c}") %>
<%# databinder.eval(container.dataitem, "integervalue", "{0:c}") %>
<%# databinder.eval(container.dataitem, "integervalue", "{0:c}") %>
c# vb jscript
格式字符串参数是可选的。假如省略他,则 databinder.eval 返回对象类型的值,如下例所示。
<%# (bool)databinder.eval(container.dataitem, "boolvalue") %>
<%# ctype(databinder.eval(container.dataitem, "boolvalue"), boolean) %>
<%# boolean(databinder.eval(container.dataitem, "boolvalue")) %>
c# vb jscript
databinder.eval 会对标准数据绑定语法带来很明显的性能损失,因为他使用后期绑定反射,注意这一点很重要。使用 databinder.eval 时需谨慎,尤其是在无需字符串格式化时。
<%@ import namespace="system.data" %>
使用 databinder.eval 进行数据绑定
|