首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET 2.0 Eval() 資料繫結運算式內部機制深度解析

     編輯:關於ASP.NET

Eval("FieldName") 是 TemplateControl.Eval 的簡化呼叫,透過 Page.GetDataItem() 從 _dataBindingContext 堆疊取得目前繫結的 DataItem,再委派 DataBinder.Eval 以反射取值。

繫結上下文堆疊運作流程

  1. Control.DataBind() 執行時,若為 IBindingContainer (如 GridViewRow、RepeaterItem),呼叫 Page.PushDataItemContext(dataItem) 將 DataItem 推入堆疊
  2. 遞迴 DataBindChildren() 繫結子控制項,此時堆疊頂端即為當前項目
  3. 子控制項模板中的 Eval() 呼叫 Page.GetDataItem() → _dataBindingContext.Peek() 取得 DataItem
  4. 繫結完成,finally 區塊 Page.PopDataItemContext() 彈出堆疊

程式碼流程圖解

// Control.DataBind 簡化
protected virtual void DataBind(bool raise)
{
    if (this.IsBindingContainer)
    {
        object dataItem = DataBinder.GetDataItem(this, out found);
        if (found) Page.PushDataItemContext(dataItem);
    }
    try { DataBindChildren(); }
    finally { if (found) Page.PopDataItemContext(); }
}

// TemplateControl.Eval
protected string Eval(string expr, string fmt)
{
    return DataBinder.Eval(Page.GetDataItem(), expr, fmt);
}

結論

Eval() 並未消除 Container.DataItem,而是將其隱藏於堆疊機制中。優點:語法簡潔;缺點:除錯時難以直觀檢視繫結上下文,效能略低於直接強型別存取 (如 ((MyRow)Container.DataItem).Field)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved