Общие сведения о выражениях для привязки данных

Обновлен: Ноябрь 2007

Выражения привязки данных позволяют связывать свойства элементов управления с данными и задавать значения для извлечения, обновления, удаления и вставки данных.

Синтаксис привязки данных

Выражения привязки данных заключаются в разделители <%# и %> и используют функции Eval и Bind. Функция Eval применяется для задания односторонней (только для чтения) привязки. Функция Bind применяется для двусторонней (обновляющей) привязки. Кроме вызовов методов Eval и Bind, внутри разделителей <%# и %> в выражении привязки данных допускается использовать любой код, разрешенный в общей области видимости, возвращающий значение и выполняемый в процессе обработки страницы.

Выражения привязки данных обрабатываются при вызове метода DataBind элемента управления или класса Page. Для таких элементов управления, как GridView, DetailsView и FormView, привязка данных устанавливается автоматически во время вызова события PreRender элемента управления, и вызывать метод DataBind явно не нужно.

В следующем примере показано использование выражений привязки данных с помощью элемента управления FormView в шаблоне ItemTemplate.

<asp:FormView ID="FormView1"
  DataSourceID="SqlDataSource1"
  DataKeyNames="ProductID"     
  RunAt="server">

  <ItemTemplate>
    <table>
      <tr><td align="right"><b>Product ID:</b></td>       <td><%# Eval("ProductID") %></td></tr>
      <tr><td align="right"><b>Product Name:</b></td>     <td><%# Eval("ProductName") %></td></tr>
      <tr><td align="right"><b>Category ID:</b></td>      <td><%# Eval("CategoryID") %></td></tr>
      <tr><td align="right"><b>Quantity Per Unit:</b></td><td><%# Eval("QuantityPerUnit") %></td></tr>
      <tr><td align="right"><b>Unit Price:</b></td>       <td><%# Eval("UnitPrice") %></td></tr>
    </table>                 
  </ItemTemplate>                   
</asp:FormView>
<asp:FormView ID="FormView1"
  DataSourceID="SqlDataSource1"
  DataKeyNames="ProductID"     
  RunAt="server">

  <ItemTemplate>
    <table>
      <tr><td align="right"><b>Product ID:</b></td>       <td><%# Eval("ProductID") %></td></tr>
      <tr><td align="right"><b>Product Name:</b></td>     <td><%# Eval("ProductName") %></td></tr>
      <tr><td align="right"><b>Category ID:</b></td>      <td><%# Eval("CategoryID") %></td></tr>
      <tr><td align="right"><b>Quantity Per Unit:</b></td><td><%# Eval("QuantityPerUnit") %></td></tr>
      <tr><td align="right"><b>Unit Price:</b></td>       <td><%# Eval("UnitPrice") %></td></tr>
    </table>                 
  </ItemTemplate>                 
</asp:FormView>

Использование метода Eval

Метод Eval вычисляет выражения позднего связывания с данными в шаблонах таких элементов управления с привязкой к данным, как GridView, DetailsView и FormView. Во время выполнения метод Eval вызывает метод Eval объекта DataBinder, указывающего на текущий элемент данных контейнера именования. Контейнер именования обычно является наименьшей частью элемента управления с привязкой к данным, содержащей целую запись, например строку в элементе управления GridView. Поэтому метод Eval можно использовать только для привязки внутри шаблона элемента управления с привязкой к данным.

Метод Eval принимает название поля данных и возвращает строку, содержащую значение этого поля в текущей записи источника данных. Можно использовать второй, необязательный, параметр для задания формата возвращаемой строки. Параметр формата строки использует синтаксис, определенный для метода Format класса String.

Использование метода Bind

Метод Bind похож на метод Eval, но имеет и значительные отличия. Хотя извлечь значения полей с привязкой к данным можно с помощью метода Bind так же, как и с помощью Eval, метод Bind также используется, когда данные могут быть изменены.

В ASP.NET элементы управления с привязкой к данным, например GridView, DetailsView и FormView, могут автоматически использовать такие операции элемента управления источником данных, как обновление, удаление и вставка. Например, если для элемента управления источником данных заданы SQL-инструкции Select, Insert, Delete и Update, то использование метода Bind в шаблоне элемента управления GridView, DetailsView или FormView позволяет элементу управления извлекать значения из дочерних элементов управления в этом шаблоне и передавать их в элемент управления источником данных. Элемент управления источником данных в свою очередь выполняет соответствующую команду базы данных. По этой причине функция Bind используется внутри шаблона EditItemTemplate или InsertItemTemplate элемента управления с привязкой к данным.

Метод Bind обычно используется с элементами управления вводом, такими как TextBox, отображаемыми в строке элемента управления GridView в режиме редактирования. Когда элемент управления с привязкой к данным при своей отрисовке создает эти элементы управления вводом, он может извлекать их входные значения.

Метод Bind принимает название поля данных, чтобы ассоциировать его со свойством привязки данных, как показано в приведенном ниже примере.

ms178366.alert_security(ru-ru,VS.90).gifПримечание о безопасности.

Данный пример содержит текстовое поле, принимающее пользовательский ввод, что является потенциальной угрозой безопасности. По умолчанию веб-страницы ASP.NET проверяют, что введенные пользователем данные не содержат сценариев и HTML-элементов. Дополнительные сведения см. в разделе Общие сведения об использовании сценариев.

<EditItemTemplate>
  <table>
    <tr>
      <td align=right>
        <b>Employee ID:</b>
      </td>
      <td>
        <%# Eval("EmployeeID") %>
      </td>
    </tr>
    <tr>
      <td align=right>
        <b>First Name:</b>
      </td>
      <td>
        <asp:TextBox ID="EditFirstNameTextBox" RunAt="Server"
          Text='<%# Bind("FirstName") %>' />
      </td>
    </tr>
    <tr>
      <td align=right>
        <b>Last Name:</b>
      </td>
      <td>
        <asp:TextBox ID="EditLastNameTextBox" RunAt="Server"
            Text='<%# Bind("LastName") %>'  />
      </td>
    </tr>
    <tr>
      <td colspan="2">
        <asp:LinkButton ID="UpdateButton" RunAt="server"
          Text="Update" CommandName="Update" />
        &nbsp;
        <asp:LinkButton ID="CancelUpdateButton" RunAt="server"
          Text="Cancel" CommandName="Cancel" />
      </td>
    </tr>
  </table>
</EditItemTemplate>

Когда для строки нажимается кнопка Update, значения каждого свойства элемента управления, привязанные с помощью функции Bind, извлекаются и передаются в элемент управления источником данных для выполнения операции обновления.

Явный вызов метода DataBind

Когда такие элементы управления, как GridView, FormView и DetailsView привязаны к элементу управления источником данных с помощью свойства DataSourceID, они выполняют привязку к данным путем неявного вызова метода DataBind. Однако есть ситуации, когда необходимо вызвать метод DataBind явным образом.

Одна из них — связывание какого-либо элемента управления с элементом управления источником данных с помощью свойства DataSource, а не с помощью DataSourceID. В этом случае необходимо вызвать метод DataBind явным образом для выполнения привязки данных и вычисления выражения привязки данных.

Другая ситуация — когда требуется вручную обновить данные в элементе управления с привязкой к данным. Рассмотрим страницу, на которой есть два элемента управления, отображающие сведения из одной и той же базы данных (возможно, использующих различные представления). В этом случае может потребоваться явная повторная привязка элемента управления к данным для поддержания синхронности отображаемых данных. Например, пусть элемент управления GridView отображает список продуктов, а элемент управления DetailsView позволяет пользователям изменять свойства отдельных продуктов. Несмотря на то, что оба элемента управления GridView и DetailsView отображают данные из одного источника, они привязаны к разным элементам управления источником данных, поскольку для получения своих данных они используют разные запросы. Пользователь может обновить запись с помощью элемента управления DetailsView, инициировав обновление соответствующего элемента управления источником данных. Но так как элемент управления GridView привязан к другому элементу управления источником данных, он будет отображать старые значения записи до тех пор, пока страница не будет обновлена. Поэтому после обновления данных элементом управления DetailsView следует вызвать метод DataBind. Это приведет к тому, что элемент управления GridView обновит свое представление и будут повторно выполнены все выражения привязки данных и код внутри разделителей <%# и %>. В результате элемент управления GridView отразит обновление, выполненное элементом управления DetailsView.

Использование привязки для таблицы подстановки

Распространенный сценарий работы с элементами управления с привязкой данных — разрешить пользователям обновлять или вставлять значение путем выбора его из таблицы подстановки с помощью элемента управления DropDownList или другого элемента управления «Список». В этом случае элемент управления подстановкой привязывается к отдельному источнику данных, возвращающему список возможных значений. Выбранное значение элемента управления подстановкой привязывается к полю в родительской строке.

Эту функциональность можно реализовать следующим образом. Во-первых, добавьте элемент управления «Список» (DropDownList или ListBox) к шаблону в элементе управления с привязкой к данным, например GridView, DetailsView или FormView. Привяжите свойство SelectedValue элемента управления подстановкой к соответствующему полю в контейнерном элементе управления источником данных. Затем присвойте свойству DataSourceID элемента управления подстановкой идентификатор элемента управления источником данных, который извлекает значения подстановки. Присвойте свойству DataTextField элемента управления подстановкой название поля из таблицы подстановки, которое содержит значения, предназначенные для отображения, и присвойте его свойству DataValueField имя поля из таблицы подстановки, которое содержит уникальный идентификатор для значения подстановки (если это допустимо).

В следующем примере показан элемент управления DropDownList, который включен в шаблон InsertItemTemplate элемента управления FormView (также это может быть шаблон InsertItemTemplate шаблона TemplateField, включенного в свойство Fields элемента управления DetailsView или в свойство Columns элемента управления GridView). Свойство SelectedValue элемента управления DropDownList использует метод Bind для двусторонней привязки к полю CategoryID текущей строки для элемента управления FormView. Свойство DataSourceID элемента управления DropDownList ссылается на идентификатор отдельного элемента управления источником данных, который извлекает список возможных имен категорий и идентификаторов. Свойство DataTextField элемента управления DropDownList ссылается на поле CategoryName из источника данных подстановки для отображения списка возможных названий категорий. Свойство DataValueField элемента управления DropDownList ссылается на поле CategoryID из источника данных подстановки для соответствующего имени категории. Когда пользователь выбирает имя категории из списка, свойству SelectedValue элемента управления DropDownList присваивается идентификатор категории для выбранного имени категории.

<tr>
  <td align="right"><b>Category:</b></td>
  <td><asp:DropDownList ID="InsertCategoryDropDownList" 
                        SelectedValue='<%# Bind("CategoryID") %>' 
                        DataSourceID="CategoriesDataSource"
                        DataTextField="CategoryName"
                        DataValueField="CategoryID"
                        RunAt="Server" />
  </td>
</tr>
<tr>
  <td align="right"><b>Category:</b></td>
  <td><asp:DropDownList ID="InsertCategoryDropDownList" 
                        SelectedValue='<%# Bind("CategoryID") %>' 
                        DataSourceID="CategoriesDataSource"
                        DataTextField="CategoryName"
                        DataValueField="CategoryID"
                        RunAt="Server" />
  </td>
</tr>

Такой же элемент управления «Список» может использоваться и в шаблоне элемента редактирования.

См. также

Задачи

Практическое руководство. Связывание данных в шаблонном элементе управления

Основные понятия

Привязка к базам данных

Привязка к бизнес-объектам

Привязка к иерархическим данным

Общие сведения о доступе к данным в ASP.NET