Auteur : Walkdan (walkdan(at)gmail.com)
Eval() d'ASP.NET 2.0 simplifie Container.DataItem ASP 1.1, tel que :
<%# (Container.DataItem as DataRowView)["ProductName"].ToString( ) %>
est simplifié en : (ASP 1.1 supprime la spécification de type, Eval est implémenté par réflexion, ce qui ne sera pas expliqué dans cet article)
<%# DataBinder.Eval(Container.DataItem, "ProductName").ToString() %>
est simplifié en (ASP 2.0) :
<%# Eval("NomProduit") %>
Eval() est une méthode de TemplateControl:Page
TemplateControl.Eval() peut calculer automatiquement le conteneur, et le mécanisme consiste à l'obtenir à partir d'une pile dataBindingContext:Stack.
1. Créez la pile DataItem Container :
Dans Control.DataBind(), établissez ceci pour garantir que le conteneur DataItem du contrôle enfant est toujours en haut de la pile.
contrôle de classe public
{
vide virtuel protégé DataBind (bool raiseOnDataBinding)
{
bool foundDataItem = faux ;
si (this.IsBindingContainer)
{
objet o = DataBinder.GetDataItem (this, out foundDataItem);
si (élément de données trouvé)
Page.PushDataItemContext(o); <-- Pousser DataItem sur la pile
}
essayer
{
si (raiseOnDataBinding)
OnDataBinding(EventArgs.Empty);
DataBindChildren(); <-- lier les contrôles enfants
}
enfin
{
si (élément de données trouvé)
Page.PopDataItemContext(); <-- Extraire le DataItem de la pile
}
}
}
2. Obtenir le conteneur DataItem
Page de classe publique
{
objet public GetDataItem()
{
...
return this._dataBindingContext.Peek(); <-- Lit le conteneur DataItem en haut de la pile, qui est le conteneur DataItem lié.
}
}
3. TemplateContro.Eval()
classe publique TemplateControl
{
chaîne protégée Eval (expression de chaîne, format de chaîne)
{
return DataBinder.Eval (Page.GetDataItem(), expression, format) ;
}
}