Autor: Walkdan (walkdan(at)gmail.com)
Eval() do ASP.NET 2.0 simplifica Container.DataItem do ASP 1.1, como:
<%# (Container.DataItem as DataRowView)["ProductName"].ToString() %>
é simplificado para: (ASP 1.1 remove a especificação de tipo, Eval é implementado por meio de reflexão, o que não será explicado neste artigo)
<%# DataBinder.Eval(Container.DataItem, "ProductName").ToString() %>
é simplificado para (ASP 2.0):
<%# Eval("NomeProduto") %>
Eval() é um método de TemplateControl:Page
TemplateControl.Eval() pode calcular automaticamente o Container, e o mecanismo é obtê-lo de uma pilha dataBindingContext:Stack.
1. Crie a pilha do contêiner DataItem:
Em Control.DataBind(), estabeleça isso para garantir que o DataItem Container do controle filho esteja sempre no topo da pilha.
classe públicaControl
{
vazio virtual protegido DataBind(bool raiseOnDataBinding)
{
bool encontradoDataItem = falso;
if (this.IsBindingContainer)
{
objeto o = DataBinder.GetDataItem(este, encontradoDataItem);
if(foundDataItem)
Page.PushDataItemContext(o);
}
tentar
{
if (raiseOnDataBinding)
OnDataBinding(EventArgs.Empty);
DataBindChildren(); <- vincula controles filho
}
finalmente
{
if(foundDataItem)
Page.PopDataItemContext();
}
}
}
2. Obtenha o contêiner DataItem
página de classe pública
{
objeto público GetDataItem()
{
...
return this._dataBindingContext.Peek(); <- Leia o contêiner DataItem no topo da pilha, que é o contêiner DataItem que está sendo vinculado.
}
}
3. TemplateContro.Eval()
classe pública TemplateControl
{
string protegida Eval (expressão de string, formato de string)
{
retornar DataBinder.Eval (Page.GetDataItem(), expressão, formato);
}
}