Существует много различий между <%# Eval %>
и <%# DataBinder.Eval %>
под обложками, хотя в документации говорится, что использование Eval
(точнее TemplateControl.Eval
) фактически вызывает DataBinder.Eval
и что их задача состоит в том, чтобы делать точно такую же работу.
Это правильно, но использование только Eval
означает, что ASP.NET сам разрешает объект с привязкой к данным. Это делается внутренне с помощью стека, в который добавляются элементы при вызове Control.DataBind()
. Хитрость заключается в том, что это происходит, только если свойство элемента управления Page
не является null
в этой точке.
Если управляемый Page
стек не обновлен, когда вы дойдете до точки, в которой необходимо разрешить DataItem
, метод Page.GetDataItem()
выдаст исключение с сообщением типа
Методы привязки данных, такие как Eval()
, XPath()
и Bind()
, могут использоваться только в контексте элемента управления с привязкой к данным.
DataBinder.Eval
все еще работает в этих обстоятельствах, поскольку вы предоставляете ему целевой объект вручную, поэтому ASP.NET не нужно выполнять какое-либо разрешение самостоятельно.