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が常にスタックの上にあることを保証するように作成する.
2.DataItem Containerの取得
3. TemplateControl.Eval()
結論:
上から見たPageEval()は計算時にContainerを引用した.DataItem,ただしこのDataItemはDataItem Containerスタックによって自動的に計算する.PageEval()は問題を簡略化したように見えるが、実は問題をもっと神秘的にしている.
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()は問題を簡略化したように見えるが、実は問題をもっと神秘的にしている.