ASP .NET - Что происходит за Eval ()? - PullRequest
5 голосов
/ 13 апреля 2010

Я пытаюсь понять, как Eval () работает для конкретной цели. Я работаю над проектом, который на самом деле не знаю, и мне нужно прочитать некоторые данные и поместить их в выпадающий список. Эти данные уже прочитаны и отображаются внутри ItemTemplate. Я заметил, что для чтения используется метод Eval (). Что-то вроде:

<ItemTemplate>
   <a href="...=<%# Eval("foo") %>></a>
</ItemTemplate>

Мне нужно знать, откуда Eval получает эти данные, чтобы узнать, где я должен их прочитать для моего выпадающего списка! Но я не очень понял, как это работает! Я знаю, что Eval () оценивает выражения привязки данных во время выполнения, но где, по вашему мнению, мне следует взглянуть?

Спасибо

Ответы [ 2 ]

3 голосов
/ 13 апреля 2010

Это хороший ресурс: http://bytes.com/topic/asp-net/answers/447041-databinder-eval-mystification

Некоторые причины, по которым этого следует избегать: http://weblogs.asp.net/jgalloway/archive/2005/09/20/425687.aspx

Один способ улучшить явное приведение: http://dotnettipoftheday.org/tips/use-explicit-casting-instead-of-databinder.eval.aspx

НТН.

2 голосов
/ 13 апреля 2010

Eval это ярлык, вроде. Это фактический вызов метода, в отличие от Bind, который больше похож на фрагмент кода.

Статья MSDN о выражениях привязки данных должна дать вам действительно хороший обзор.

Проще говоря, синтаксический анализатор, когда он читает страницу, вызывает DataBinder.Eval и передает текущий DataItem в контексте вместе с указанной строкой. Это очень похоже на чтение столбцов из DataReader.

DataItem в контексте зависит от того, где это происходит. Например, в GridView это, вероятно, будет похоже на объект DataRow в DataTable, к которому был привязан GridView, но на самом деле это может быть любой объект, поскольку он работает посредством отражения. В случае DataRow Eval («Foo») попытается извлечь данные из столбца Foo в DataRow.

Теперь вы можете видеть, где это может пойти плохо. Если DataRow перестает включать столбец Foo, то вызов Eval будет с треском провален, но только до времени выполнения, поскольку не требуется строгой проверки типа / имени.

...