ASP.NET Evalによるデータバインドの方法

2134 ワード

ASPを知っているとしたらNET Eval 1.1のデータバインディング(特にContainerという局所変数)のメカニズムは,ここで主にASPを解析する.NET Eval 2.0データバインディングはそれらの改善を行った.
ASP.NET Eval 2.0のデータバインド関数Eval()はASPを簡略化した.NET Eval 1.1謎のContainer.データ・バインディング式などのDataItem:
 
  


ASP.NET Eval 1.1は以下のように簡略化されている:(タイプ指定を除いて、Evalは反射によって実現され、ここでは説明しない)
 
  


ASP.NET Eval 2.0は、Containerローカル変数を削除するように簡略化されています.
じゃあ、Page.Eval()はまたどのように“ProductName”がそのデータの属性であることを知っていますか、つまりContainer.DataItemは本当に消えたの?
ASP.NET Eval()はPageの親TemplateControlのメソッドです
TemplateControl.Eval()はContainerを自動的に計算することができ、メカニズムはdataBindingContext:Stackスタックから取得する.
1.DataItem Containerスタックの構築:
コントロールで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);

}

try

{

if (raiseOnDataBinding)

OnDataBinding(EventArgs.Empty);

DataBindChildren();

}

finally

{

if (foundDataItem)

Page.PopDataItemContext();

}

}

}


2.DataItem Containerの取得
 
  
public class Page

{

public object GetDataItem()

{

...

return this._dataBindingContext.Peek();

}

}


3. TemplateControl.Eval()
 
  
public class TemplateControl

{

protected string Eval (string expression, string format)

{

return DataBinder.Eval (Page.GetDataItem(), expression, format);

}

}


結論:
上から見たPageEval()は計算時にContainerを引用した.DataItem,ただしこのDataItemはDataItem Containerスタックによって自動的に計算する.PageEval()は問題を簡略化したように見えるが、実は問題をもっと神秘的にしている.