首页 > 编程 > .NET > 正文

ASP.NET立即上手教程(8)

2024-07-10 13:12:19
字体:
来源:转载
供稿:网友
中国最大的web开发资源网站及技术社区,

asp.net引入了一种新的声明数据绑定的语法。这种极其灵活的语法允许开发者不仅绑定数据源,而且可以绑定简单的属性、集合、表达式、甚至是调用方法所返回的结果。下面的列表显示了这种新语法的一些例子:
简单属性

customer: <%# custid %>

集合

orders: <asp:listbox id="list1" datasource='<%#

myarray %>' runat="server">

表达式

contact: <%# ( customer.first name + " " + customer.lastname

   ) %>

方法结果

outstanding balance: <%# getbalance(custid) %>

尽管这种语法看上去和asp中response.write的简写方式<%= %>很类似,但他们的运行机理却大不相同。response.write的简写语法在页面处理的时候求值,而asp.net数据绑定语法只有当调用databind方法的时候才求值。

databind是page和所有服务器控件的一个方法。当你对一个父控件调用databind方法的时候,他所包含的子控件都会调用databind方法。比如执行datalist1.databind(),datalist模板中的所有控件都引用了databind方法。在page调用databind方法--- page.databind()或者简单的databind() ---导致页面上所有的数据绑定表达式都会被求值。databind经常在page_load事件中被调用,比如下面的例子:

protected void page_load(object src, eventargs e) {
  databind();
}

你几乎可以在.aspx页面中声明部分的任何地方使用数据绑定表达式,在运行时提供它所计算的预期的数据类型。当求值以后,简单的属性、表达式以及上例中的方法,将向用户显示文本。在这些情况下,数据绑定表达式必须求出一个string类型的值。在集合的例子中,数据绑定表达式所求值的类型,对于listbox的datasource 属性来说是有效的。你会发现,在数据绑定表达式中为了得到期望的结果,强制转换结果值的类型,是很有必要的。例如,如果count是一个整数:

number of records: <%# count.tostring() %>

绑定简单属性

asp.net数据绑定语法支持绑定页面的公共变量和属性,以及页面上其他控件的属性。

下面的例子说明了绑定到页面的公共变量和简单属性。注意这些值在调用databind()之前已被初始化。

绑定集合和列表

列表服务器控件,如datagrid、 listbox 和 htmlselect,使用集合作为数据源。下面的例子说明绑定到常用的clr 集合类型。这些控件只能绑定到支持ienumerable, icollection, 或 ilistsource 接口的集合。通常,您可以绑定到arraylist、 hashtable、 dataview 和datareader.

很多时候,在绑定到页面或控制之前,你可能会操作这些数据。
 
databinder.eval方法

asp.net框架提供了一个静态方法databinder.eval,可以计算后期数据绑定表达式的值,并可以将结果任意格式化为字符串。databinder.eval是很方便的,他排除了许多开发人员必须作的(通过强制改变值的类型来得到预期的数据类型)显式转换。尤其是在带有模板列表的数据绑定控件中,因为经常需要显式转换数据行和数据字段,所以它特别有用。

仔细看下面的代码,整数将被显示为货币型字符串。使用标准的asp.net数据绑定语法,为了得到数据字段integervalue,你必须首先显式转换数据行的类型,然后作为string.format方法的参数才能得到结果

<%# string.format("{0:c}", ((datarowview)container.dataitem)["integervalue"]) %>

这样的语法实在错综复杂的难以记忆。比较而言,databinder.eval 就很简单了。它带有三个参数:数据项的命名容器、数据字段名称和格式化字符串。 在模板列表如datalist、datagrid、或 repeater,命名容器总是container.dataitem。 page 是另一个可以被databinder.eval使用的命名容器。

<%# databinder.eval(container.dataitem, "integervalue", "{0:c}") %>

格式化字符串参数是可选的。如果忽略参数,databinder.eval 返回对象类型的值,就象下面的代码这样:

<%# (bool)databinder.eval(container.dataitem, "boolvalue") %>

很重要的一点需要注意:由于受后期绑定影响,databinder.eval与标准的数据绑定语法相比,在执行效率上有明显的差别。因此有选择地使用databinder.eval,特别是不需要对字符串进行格式化的时候。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表