Autor: Walkdan (walkdan(at)gmail.com)
Eval() de ASP.NET 2.0 simplifica Container.DataItem de ASP 1.1, como por ejemplo:
<%# (Container.DataItem as DataRowView)["ProductName"].ToString() %>
se simplifica a: (ASP 1.1 elimina la especificación de tipo, Eval se implementa mediante reflexión, lo que no se explicará en este artículo)
<%# DataBinder.Eval(Container.DataItem, "ProductName").ToString() %>
se simplifica a (ASP 2.0):
<%# Eval("NombreProducto") %>
Eval() es un método de TemplateControl:Página
TemplateControl.Eval() puede calcular automáticamente el Contenedor, y el mecanismo es obtenerlo de una pila dataBindingContext:Stack.
1. Cree la pila del contenedor DataItem:
En Control.DataBind(), establezca esto para garantizar que el contenedor DataItem del control secundario esté siempre en la parte superior de la pila.
control de clase pública
{
DataBind vacío virtual protegido (bool riseOnDataBinding)
{
bool encontradoDataItem = falso;
si (this.IsBindingContainer)
{
objeto o = DataBinder.GetDataItem (esto, fuera de foundDataItem);
si (artículo de datos encontrado)
Page.PushDataItemContext(o); <-- Empujar DataItem a la pila
}
intentar
{
si (raiseOnDataBinding)
OnDataBinding(EventArgs.Empty);
DataBindChildren(); <- vincular controles secundarios
}
finalmente
{
si (artículo de datos encontrado)
Page.PopDataItemContext(); <-- Saque el elemento de datos de la pila
}
}
}
2. Obtener el contenedor de elementos de datos
página de clase pública
{
objeto público GetDataItem()
{
...
return this._dataBindingContext.Peek(); <-- Lee el contenedor de elementos de datos en la parte superior de la pila, que es el contenedor de elementos de datos que se está vinculando.
}
}
3. PlantillaContro.Eval()
Control de plantilla de clase pública
{
cadena protegida Eval (expresión de cadena, formato de cadena)
{
devolver DataBinder.Eval (Page.GetDataItem(), expresión, formato);
}
}