浅谈.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类还提供了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对象的,如果没有则会抛出一个异常
。
要%
本节涉及的内容如下:
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类的基类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对象的,如果没有则会抛出一个异常
。
要%
相关文章推荐
- 浅谈.NET中的数据绑定表达式(一)
- 浅谈.NET中的数据绑定表达式
- [转]浅谈.NET中的数据绑定表达式(二)
- 浅谈.NET中的数据绑定表达式(一)(转)
- 浅谈.NET中的数据绑定表达式(二)
- 浅谈.NET中的数据绑定表达式(一)
- 浅谈.NET中的数据绑定表达式
- 浅谈.NET中的数据绑定表达式(一)
- 浅谈.NET中的数据绑定表达式(一)(转)
- 浅谈.NET中的数据绑定表达式(二)
- 浅谈.NET中的数据绑定表达式
- 【转】浅谈.NET中的数据绑定表达式1
- 浅谈.NET中的数据绑定表达式(一)
- 浅谈.NET中的数据绑定表达式(一)
- 浅谈.NET中的数据绑定表达式
- [转]浅谈.NET中的数据绑定表达式(一)
- 浅谈.NET中的数据绑定表达式(一) [转]
- 浅谈.NET中的数据绑定表达式(二) [转]
- 浅谈.net中的数据绑定表达式
- 浅谈.NET中的数据绑定表达式(二)