ASP.NET Evalデータバインドの方法
8922 ワード
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:
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 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()は問題を簡略化したように見えますが、実は問題をもっと神秘的にしています.