您的位置:首页 > 编程语言 > ASP

浅谈.NET中的数据绑定表达式(二) [转]

2010-07-16 08:55 351 查看
这一节继续来谈.NET中的数据绑定表达式。


本节涉及的内容如下:

1,数据绑定方法的来源以及在低层上的实现。

2,数据绑定方法的执行效率排序。

<%
#Container.DataItem
%>

<%
#GetDataItem()
%>

<%
#
Eval
(
"
字段名
"
)
%>

<%
#DataBinder.Eval(Container.DataItem,
"
字段名
"
)
%>

<%
#((DataRowView)Container.DataItem)[
"
字段名
"

%>

<%
#((Type)Container.DataItem).成员 
%>

<%
#((Type)GetDataItem()).成员 
%>

上面七种绑定形式以及它们的变幻形式都用过吗?性能怎么排序?

复习一下:
第一节

我们主要谈了数据绑定表达式的各种形式,在ASP.NET页面中出现的位置,以及我们常绑定到与数据库有关的
DataView,DataTable,DataSet

等数据源的数据绑定表达式的各种形式。

你有没有对Eval方法和DataBinder.Eval方法好奇过?

在.NET2.0中我们经常用Eval方法在Repeater,DataList,GridView等循环控件中绑定数据,Eval方法和DataBinder.Eval方法在低层是怎么实现的?它们到底有什么千丝万缕的关系?

一,来源、实现。


们常用的Eval方法其实是Page类的一个静态单向只读方法,而且它是一个受保护的方法。实际上Page类的Eval方法是继承自
TemplateControl类的。TemplateControl 类是一个抽象类,它为Page 类和 UserControl
类提供通用属性和方法。我们先来看一下继承家谱:

System.Object

   System.Web.UI.Control

    System.Web.UI.TemplateControl

       System.Web.UI.Page

       System.Web.UI.UserControl

Eval方法就是TemplateControl类的方法,它有两种形式:

名称
说明
TemplateControl.Eval (String)
计算数据绑定表达式。
TemplateControl.Eval (String, String)
使用用于显示结果的指定格式字符串计算数据绑定表达式。
事实上TemplateControl类还提供了XPath方法和XPathSelect方法供Page类和UserControl继承。这2个方法是和XML数据源有关的绑定方法。

如果细心的你查看TemplateControl类的基类Control类,你就会发现其实Control类并没有提供Eval,XPath,XPathSelect等方法。所以Eval,XPath等方法最终是在TemplateControl类中实现的。

现在,终于找到了Eval,XPath等数据绑定方法的来源了。

Eval,XPath等方法是.NET 2.0新增的方法。在.NET 1.1时代我们经常用的是DateBinder.Eval方法。形如:

<%
#DataBind.Eval(Container.DataItem,
"
字段名
"

%>

<%
#DataBind.Eval(Container.DataItem,
"
字段名
"
,
"
{0:c}
"

%>

Eval的出现其实就是为了简化DataBinder.Eval方法的写法从而代替它。
在ASP.NET 2.0中及以上,当我们调用Eval时,Eval 方法会使用GetDataItem方法调用DataBinder.Eval方法计算表达式的值


要想理解这句话,就算查边MSDN也一头雾水,除非我们知道Eval方法的源代码,否则根本找不到蛛丝马迹。这里就要用到反射了。我们通过反射获得了Eval方法的源代码:

protected
   
internal
   
object
   Eval(
string

   expression)   

  {   

            
this

.CheckPageExists();   

            
return
   DataBinder.Eval(
this

.Page.GetDataItem(),   expression);   

  }   

终于见到GetDataItem()方法了,其实它就是
Page类的一个方法,也是.NET
2.0新增一个方法。GetDataItem()方法的作用是为了获得Container.DataItem,它是.NET
2.0中用来代替Container.DataItem的,如果你曾经用Repeater和DataList等绑定过数组或者ArrayList等,你就
会发现<%#GetDataItem()%>和<%#Container.DataItem%>等价。

同时,
可以肯定:Eval方法在低层上确实是调用DataBinder.Eval方法实现数据绑定的

其中“this.CheckPageExists();” 是检查调用的时候有没有Page对象的,如果没有则会抛出一个异常



要%
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息