top
Loading...
ASP.NET2.0數據綁定函數Eval()的機制
教程推薦
·ASP.NET初學者入門實踐
·Visual Baisc.NET入門
·基于C#的接口基礎教程
·Visual Studio 2005
精彩專題
·ASP.NET創建XML Web服務
·Visual Basic 9.0新功能
·VB2005實現RSS覽盡天下事
主題社區
·ASP.NET源碼·ASP.NET

本文假設你已經了解ASP.NET 1.1的數據綁定(特別是Container這個局部變量)的機制,這里主要分析ASP 2.0數據綁定做了那些改進。

ASP.NET 2.0 的數據綁定函數Eval()簡化掉了ASP 1.1神秘的Container.DataItem,比如數據綁定表達式:

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

ASP.NET 1.1簡化為:(去掉了類型指定, Eval通過反射實現,本文不再闡述)

<%# DataBinder.Eval(Container.DataItem, "ProductName").ToString() %>

ASP.NET 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()看似把問題簡化了,其實把問題搞得更加神秘。

軟件頻道精品推薦

更多精彩
點擊體驗>>

作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗