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


ASP.NET Evalのデータバインディングの面での応用はよく知られているが、技術はASP.NET Eval 1.1がASPになる.NET Eval 2.0の場合、操作時にどのような変化がありますか?
ASPを知っているとしたらNET Eval 1.1のデータバインディング(特にContainerという局所変数)のメカニズムは,ここで主にASPを解析する.NET Eval 2.0データバインディングはそれらの改良を行った.
  ASP.NET Eval 2.0のデータバインド関数Eval()はASPを簡略化した.NET Eval 1.1謎のContainer.データ・バインディング式などのDataItem:
   
   
   
   
% # (Container.DataItem as DataRowView)[ " ProductName " ].ToString() %

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

  ASP.NET Eval 2.0は、Containerローカル変数を削除するように簡略化されています.
   
   
   
   
% # Eval( " ProductName " ) %

じゃあ、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); <
-- 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);
 }
}

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