Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка под ASP.NET > Механизмы связывания с данными (инфа)


Автор: tol05 17.5.2007, 11:28
Один мой друг признался, что не знает механизмов динамической привязки контролов к данным. А я вспомнил, что и здесь, на форуме как-то натыкался на вопросы об этом.
Вот, написал как сумел, думаю, новичкам будет интересно почитать.  smile 

Для декларативного связывания элементов с данными (в тегах на aspx странице) введено новое динамическое выражение
Код
<%# выражение %>

выражение - свойство/метод или любой код, который возвращает допустимое для связывания значение

Синтаксический анализатор страниц ASP.NET распознает этот символ и автоматически создает для экземляра этого контрола обработчик события DataBinding.
Выражение вычисляется только после вызова метода DataBind() ! Если его не вызвать - связывания не будет. (при вызове метода DataBind() вызывается событие DataBinding, причем все контролы привязываются к данным в той последовательности, в которой они задекларированы на странице aspx)

Новые контролы, представляющие источники данных (например SqlDataSource), привязывают данные к своим контролам управления (например к GridView) без явного вызова DataBind() и не генерируют для страницы события, по которым данные можно запросить. Не подходит к ним выражение <%# выражение %> вот почему

если написать в aspx
Код

<asp:SqlDataSource ID="MySource" runat="server" ConnectionString=<%# ConfigurationManager.ConnectionStrings[...] %> />
<asp:GridView DataSourceID="MySource" ID="MyGrid" runat="server" />

то тогда, вызвав в Page_Load() метод DataBind(), в методе-обработчике DataBindingMySource  свойство MySource.ConnectionString вычисляется и когда анализатор страницы доходит до GridView, то все нормально, методе-обработчике DataBindingGrid MyGrid свои данные получает от MySource

но если мы объявим на странице так
Код

<asp:GridView DataSourceID="MySource" ID="MyGrid" runat="server"/>
<asp:SqlDataSource ID="MySource" runat="server" ConnectionString=<%# ConfigurationManager.ConnectionStrings[...] %> />


то тогда, опять же при вызвове в Page_Load() метода DataBind(), в методе DataBindingGrid обращается за данными к MySource, а он не может их дать, потому что его метод (DataBindingMySource) еще не вызывался (будет вызван после окончания полной обработки MyGrid, в соответствии с деревом елементов страницы) !
Вот и выбрасывается исключение.

Для решения этой проблемы введены новые $-выражения:
Код
<%$ префикс:выражение %>

Код

<asp:GridView DataSourceID="MySource" ID="MyGrid" runat="server"/>
<asp:SqlDataSource ID="MySource" runat="server" ConnectionString="<%$ ConnectionStrings:LocalNWind %>" />

сразу о префиксах. Это "AppSettings", "ConnectionStrings" или "Resources". Для каждого из них есть отдельный класс, построитель выражения. 

Назначение - установка свойств контролов в обход стандартного механизма связывания с данными (но все равно, на этапе синтаксического разбора smile )
Поскольку анализатор в этих строках не видит символа "#" то связывание с данными происходит не при вызове DataBinding-ов (когда уже обрабатываются события страницы), а еще при конструировании элемента управления. Анализатор страницы создает объект построителя выражений и засталяет его это выражение построить уже при парсинге.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)