`
wjm901215
  • 浏览: 146705 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ASP 2.0 数据绑定函数Eval()的机制

阅读更多
Author:Walkdan
本文假设你已经了解ASP 1.1的数据绑定(特别是Container这个局部变量)的机制,这里主要分析ASP 2.0数据绑定做了那些改进。

ASP.NET 2.0 的数据绑定函数Eval()简化掉了ASP 1.1神秘的Container.DataItem,比如数据绑定表达式:

<%# (Container.DataItem as DataRowView)["ProductName"].ToString() %>

ASP 1.1简化为:(去掉了类型指定, Eval通过反射实现,本文不再阐述)
<%# DataBinder.Eval(Container.DataItem, "ProductName").ToString() %>

ASP 2.0又简化为,去掉了Container局部变量:
<%# Eval("ProductName") %>

那么,Page.Eval()又是如何知道"ProductName"是那个数据的属性呢,即Container.DataItem真的消失了吗?

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()看似把问题简化了,其实把问题搞得更加神秘。

分享到:
评论

相关推荐

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

    ASP.NET Eval 2.0 的数据绑定函数Eval&#40;&#41;简化掉了ASP.NET Eval 1.1神秘的Container.DataItem,比如数据绑定表达式: 代码如下:&lt;&#37;# (Container.DataItem as DataRowView)[“ProductName”].ToString() %&gt;...

    ASP.NET 2.0+SQL Server 2005全程指南-源代码

    8.2.3 Eval0方法和Bind()方法绑定数据 8.3 本章小结 第9章 GridView及其他数据控件的应用 9.1 GridView控件的应用 9.1.1 GridView控件的概述 9.1.2 使用GridView控件的绑定列绑定数据 9.1.3 使用GridView...

    总结Visual Studio下ASP.NET模板化控件中的数据绑定

    在模板化控件中绑定到数据 FormView、DataList、Repeater 和 ListView Web 服务器控件使用模板显示数据和检索用户输入,...然后可以在模板中使用 Eval 和 Bind 函数绑定到数据源中的数据。有关更多信息,请参见 数据绑

    asp.net Repeater绑定时使用函数

    在后台cs文件中有个函数: 代码如下... 您可能感兴趣的文章:收集学习asp.net比较完整的面向对象开发流程ASP.NET编程中经常用到的27个函数集asp.net简化接收参数值的函数介绍几个ASP.NET中容易忽略但却很重要的方法函数A

    VBSCRIP5 -ASP用法详解

    GetRef 函数 返回对可以绑定到事件的过程的引用。 Global 属性 设置或返回 Boolean 值。 Hex 函数 返回表示数的十六进制值的字符串。 HelpContext 属性 设置或返回帮助文件中某主题的上下文 ID。 HelpFile 属性 ...

    asp.net专家疑难解答200问

    如何使用DataBinder.Eval()方法进行数据绑定 139.如何将ArrayList绑定到ListBox Web控件 140.如何将Hashtable绑定到RadioButtonList Web控件 141.如何将XML作为数据源绑定到控件 第8章 数据库设计 ...

    asp.net专家疑难解答200问源码

    138.如何使用DataBinder.Eval()方法进行数据绑定 139.如何将ArrayList绑定到ListBox Web控件 140.如何将Hashtable绑定到RadioButtonList Web控件 141.如何将XML作为数据源绑定到控件 第8章 数据库设计 143.ASP...

    根据Eval&#40;&#41;函数绑定的值,来显示GridView中的控件的方法

    代码如下:&lt;asp HeaderText=”操作” ShowHeader=”False”&gt; &lt;ItemTemplate&gt; &lt;asp ID=”btn_zhiding” runat=”server” CommandName=”Tranfer” CommandArgument='&lt;&#37;#Eval&#40;\u201cARTICLE_ID\u201d&#41;%...

    ASP.NET常用代码

    id='&lt;%# DataBinder.Eval(Container.DataItem, "数据字段1")%&gt;' & name='&lt;%# DataBinder.Eval(Container.DataItem, "数据字段2")%&gt;' /&gt; 7.表格点击改变颜色 if (e.Item.ItemType == ListItemType.Item ||e.Item....

    ASP.NET编程之道.part1.rar

    谬误14 数据绑定表达式中Eval功能等价于Bind 谬误15 .Net中的数组类型和C++的数组没有区别 谬误16 泛型不被指定的情况下是不确定的类型 谬误17 Object类型比较方法上的一些误解 谬误18 .NET中的线程等价于Win32线程 ...

    ASP.NET程序中常用的三十三种代码.txt

     &lt; %# DataBinder.Eval(Container.DataItem, "数据字段1")%&gt;’ & name=’&lt;% # DataBinder.Eval(Container.DataItem, "数据字段2")%&gt;’ /&gt;  7.表格点击改变颜色 if (e.Item.ItemType == ListItemType.Item ||e....

    C#编程经验技巧宝典

    111 &lt;br&gt;0184 如何在ASP.NET中获取文件的扩展名 111 &lt;br&gt;0185 如何在ASP.NET中用URL在页面之间传值 112 &lt;br&gt;0186 如何使用IsPostBack实现ASP.NET页面加载 112 &lt;br&gt;0187 如何利用输出缓存技术缓存...

    亮剑.NET深入体验与实战精要2

    8.2.1 安装ASP.NET 2.0 Ajax Extensions 333 8.2.2 创建ASP.NET Ajax应用程序 333 8.2.3 ScriptManager控件使用技巧 335 8.2.4 UpdaetPanel控件使用技巧 336 8.2.5 AsyncPostBackTrigger实现 外部控件引发局部刷新...

    亮剑.NET深入体验与实战精要3

    8.2.1 安装ASP.NET 2.0 Ajax Extensions 333 8.2.2 创建ASP.NET Ajax应用程序 333 8.2.3 ScriptManager控件使用技巧 335 8.2.4 UpdaetPanel控件使用技巧 336 8.2.5 AsyncPostBackTrigger实现 外部控件引发局部刷新...

    js使用小技巧

    asp: request.servervariables("HTTP_REFERER") javascript: document.referrer 释放内存 CollectGarbage(); 禁止右键 document.oncontextmenu = function() { return false;} 禁止保存 &lt;noscript&gt;...

Global site tag (gtag.js) - Google Analytics