Автор: Walkdan (walkdan(at)gmail.com)
Функция Eval() в ASP.NET 2.0 упрощает 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("ИмяПродукта") %>
Eval() — это метод TemplateControl:Page.
TemplateControl.Eval() может автоматически вычислить Контейнер, и механизм заключается в его получении из стека dataBindingContext:Stack.
1. Создайте стек контейнера DataItem:
В Control.DataBind() установите это, чтобы гарантировать, что контейнер DataItem дочернего элемента управления всегда находится на вершине стека.
публичный классControl
{
защищенная виртуальная пустота DataBind (bool raiseOnDataBinding)
{
Bool FoundDataItem = ложь;
если (this.IsBindingContainer)
{
объект o = DataBinder.GetDataItem(это, из FoundDataItem);
если (найденныйэлемент данных)
Page.PushDataItemContext(o); <- Поместить DataItem в стек
}
пытаться
{
если (поднятьОндатабиндинг)
OnDataBinding(EventArgs.Empty);
DataBindChildren(); привязать дочерние элементы управления
}
окончательно
{
если (найденныйэлемент данных)
Page.PopDataItemContext(); Извлекаем DataItem из стека
}
}
}
2. Получение контейнера DataItem
Страница публичного класса
{
общедоступный объект GetDataItem()
{
...
return this._dataBindingContext.Peek(); <- Считайте контейнер DataItem в верхней части стека, который является привязываемым контейнером DataItem.
}
}
3. ШаблонКонтроль.Eval()
общедоступный класс TemplateControl
{
защищенная строка Eval (строковое выражение, формат строки)
{
вернуть DataBinder.Eval(Page.GetDataItem(), выражение, формат);
}
}