작성자: Walkdan(walkdan(at)gmail.com)
ASP.NET 2.0의 Eval()은 다음과 같은 ASP 1.1 Container.DataItem을 단순화합니다.
<%# (Container.DataItem as DataRowView)["ProductName"].ToString( ) %>는
다음과 같이 단순화됩니다. (ASP 1.1은 유형 사양을 제거하고 Eval은 리플렉션을 통해 구현되므로 이 기사에서는 설명하지 않습니다.)
<%# DataBinder.Eval(Container.DataItem, "ProductName").ToString() %>
은 (ASP 2.0)로 단순화됩니다.
<%# 평가("제품 이름") %>
Eval()은 TemplateControl:Page의 메서드입니다.
TemplateControl.Eval()은 컨테이너를 자동으로 계산할 수 있으며 메커니즘은 dataBindingContext:Stack 스택에서 컨테이너를 가져오는 것입니다.
1. DataItem 컨테이너 스택을 생성합니다.
Control.DataBind()에서 이를 설정하여 하위 컨트롤의 DataItem 컨테이너가 항상 스택 맨 위에 있도록 합니다.
공개 클래스 컨트롤
{
보호된 가상 무효 DataBind(bool raiseOnDataBinding)
{
boolfoundDataItem = false;
if(this.IsBindingContainer)
{
object o = DataBinder.GetDataItem(this, outfoundDataItem);
if(foundDataItem)
Page.PushDataItemContext(o) <-- DataItem을 스택에 푸시합니다.
}
노력하다
{
if(raiseOnDataBinding)
OnDataBinding(EventArgs.Empty);
DataBindChildren(); <-- 자식 컨트롤 바인딩
}
마지막으로
{
if(foundDataItem)
Page.PopDataItemContext() <-- 스택에서 DataItem을 팝합니다.
}
}
}
2. DataItem 컨테이너 가져오기
공개 수업 페이지
{
공용 객체 GetDataItem()
{
...
return this._dataBindingContext.Peek(); <-- 바인딩되는 DataItem 컨테이너인 스택 상단의 DataItem 컨테이너를 읽습니다.
}
}
3. 템플릿콘트로.평가()
공개 클래스 TemplateControl
{
보호된 문자열 Eval(문자열 표현식, 문자열 형식)
{
return DataBinder.Eval(Page.GetDataItem(), 표현식, 형식);
}
}