欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET Eval进行数据绑定的方法

程序员文章站 2024-03-31 16:36:16
假设你已经了解asp.net eval 1.1的数据绑定(特别是container这个局部变量)的机制,这里主要分析asp.net eval 2.0数据绑定做了那些改进....

假设你已经了解asp.net eval 1.1的数据绑定(特别是container这个局部变量)的机制,这里主要分析asp.net eval 2.0数据绑定做了那些改进.

asp.net eval 2.0 的数据绑定函数eval()简化掉了asp.net eval 1.1神秘的container.dataitem,比如数据绑定表达式:

复制代码 代码如下:

<%# (container.dataitem as datarowview)["productname"].tostring() %>

asp.net eval 1.1简化为:(去掉了类型指定, eval通过反射实现,本文不再阐述)
复制代码 代码如下:

<%# databinder.eval(container.dataitem, "productname").tostring() %>

asp.net eval 2.0又简化为,去掉了container局部变量:

<%# eval("productname") %>

那么,page.eval()又是如何知道"productname"是那个数据的属性呢,即container.dataitem真的消失了吗?

asp.net eval()是page的父类templatecontrol的方法

templatecontrol.eval()可以自动计算出container, 机制就是从一个databindingcontext:stack堆栈来获取.

1. 建立dataitem container 栈:

在control.databind()中,建立,这样可以保证子控件的dataitem container始终在栈顶.

复制代码 代码如下:

public class control

{

protected virtual void databind(bool raiseondatabinding)

{

bool founddataitem = false; if (this.isbindingcontainer)

{

object o = databinder.getdataitem(this, out founddataitem);

if (founddataitem)

page.pushdataitemcontext(o); <-- 将dataitem压入堆栈

}

try

{

if (raiseondatabinding)

ondatabinding(eventargs.empty);

databindchildren(); <-- 绑定子控件

}

finally

{

if (founddataitem)

page.popdataitemcontext(); <-- 将dataitem弹出堆栈

}

}

}


2. 获取dataitem container
复制代码 代码如下:

public class page

{

public object getdataitem()

{

...

return this._databindingcontext.peek(); <-- 读取堆栈顶部的dataitem container,就是正在绑定的dataitem container

}

}


3. templatecontrol.eval()
复制代码 代码如下:

public class templatecontrol

{

protected string eval (string expression, string format)

{

return databinder.eval (page.getdataitem(), expression, format);

}

}


结论:

从上面看出page.eval()在计算的时候还是引用了container.dataitem,只不过这个dataitem通过dataitem container堆栈自动计算出来的.我认为page.eval()看似把问题简化了,其实把问题搞得更加神秘.