Статьи

ASP.NET 4.5 строго типизированные элементы управления данными и привязка моделей

Я продолжаю серию статей о том, что нового в ASP.NET 4.5.

Некоторое болевое место, которое преследовало разработчиков WebForm в течение некоторого времени, заключается в том, что не было никаких строго типизированных элементов управления данными. Некоторые из элементов управления данными, о которых я говорю, включают в себя элементы управления Repeater, FormView и GridView. Все они использовали шаблоны, которые могли позволить вам указать представление для различных операций, например, когда вы редактируете данные по сравнению с добавлением новых данных.

Когда вы используете эти шаблоны сегодня, они используют выражения с поздней привязкой для привязки данных. Если вы используете элемент управления GridView или любой другой элемент управления данными, вы знакомы с синтаксисом Bind или Eval:

  <asp: GridView ID = "GridView1" runat = "server" AutoGenerateColumns = "false">
       <Колонки>
            <asp: TemplateField HeaderText = "Name">
                     <ItemTemplate>
                         <asp: Label ID = "lblName" runat = "server" Text = '<% # Bind ("Name")%>'> </ asp: Label>
                     </ ItemTemplate>
                 </ Жерех: TemplateField>
                 <asp: TemplateField HeaderText = "Город">
                      <ItemTemplate>
                         <asp: Label ID = "lblCity" runat = "server" Text = '<% # Bind ("Address.City")%>'> </ asp: Label>
                      </ ItemTemplate>
                 </ Жерех: TemplateField>
       </ Columns>
  </ Жерех: GridView> 

Одна из проблем, связанных с элементами управления данными с поздним связыванием, заключается в использовании строки для представления имени свойства. Если вы допустите ошибку при вводе имени, вы не увидите исключения до времени выполнения. Гораздо лучше ловить эти ошибки во время компиляции. К счастью, Microsoft решила эту проблему в ASP.NET 4.5, внедрив строго типизированные элементы управления данными.

Установка

Перед началом любой разработки вам необходимо установить ASP.NET 4.5. Самый простой способ сделать это через установщик веб-платформы. Все статьи ASP.NET 4.5, которые я создаю, разработаны в Visual Studio 2011 Developer Preview. Вот ссылка для начала.

Сильно типизированные элементы управления данными

ASP.NET 4.5 представляет строго типизированные элементы управления данными в шаблонах. Новое свойство ModelType было добавлено в элементы управления данными, и это позволяет вам указать тип объекта, который связан с элементом управления.

Установка этого свойства добавит этот тип к элементам управления данными Intellisense (функция автозаполнения), что означает, что больше нет ошибок при печати! Это устраняет необходимость запуска веб-сайта, чтобы увидеть, не допустили ли вы какие-либо ошибки при печати.

В этом примере я подключился к веб-сервису Northwind. Используя ASP.NET 4.5, я могу установить для ModelType значение Northwind. Если требование для односторонней привязки данных, вы можете использовать выражение Item . Bind("Name") становится Item.Name . То же самое касается городской собственности. Заменить Bind("Address.City") на Item.Address.City .

  <asp: GridView ID = "GridView1" runat = "server" AutoGenerateColumns = "false"
             ModelType = "WebApplication2.NorthwindService.Supplier">
         <Колонки>
             <asp: TemplateField HeaderText = "Name">
                 <ItemTemplate>
                     <asp: Label ID = "lblName" runat = "server" Text = '<% # Item.Name%>'> </ asp: Label>
                 </ ItemTemplate>
             </ Жерех: TemplateField>
             <asp: TemplateField HeaderText = "Город">
                 <ItemTemplate>
                     <asp: Label ID = "lblCity" runat = "server" Text = '<% # Item.Address.City%>'> </ asp: Label>
                 </ ItemTemplate>
             </ Жерех: TemplateField>
         </ Columns>
     </ Жерех: GridView> 

Для двусторонней привязки данных используйте Binditem . Таким образом, используя приведенный выше пример, привязка данных к текстовому полю будет выглядеть так:

  <asp: GridView ID = "GridView1" runat = "server" AutoGenerateColumns = "false"
             ModelType = "WebApplication2.NorthwindService.Supplier">
         <Колонки>
             <asp: TemplateField HeaderText = "Name">
                 <ItemTemplate>
                     <asp: TextBox ID = "txtName" runat = "server" Text = '<% # Binditem.Name%>'> </ asp: TextBox>
                 </ ItemTemplate>
             </ Жерех: TemplateField>
             <asp: TemplateField HeaderText = "Город">
                 <ItemTemplate>
                     <asp: TextBox ID = "txtCity" runat = "server" Text = '<% # Binditem.Address.City%>'> </ asp: TextBox>
                 </ ItemTemplate>
             </ Жерех: TemplateField>
         </ Columns>
     </ Жерех: GridView> 

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

A typographical error in code

Привязка модели

Привязка модели фокусируется на кодированной логике доступа к данным. Ранее, если вы хотели отобразить данные в элементе управления GridView, вам нужно было либо явно установить свойство DataSource и вызвать его метод DataBind из кода. Как этот пример:

  защищенная пустота Page_Load (отправитель объекта, EventArgs e)
 {
      var products = GetProducts ();
      GridView1.DataSource = products;
      GridView1.DataBind ();
 } 

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

  <asp: GridView ID = "GridView1" runat = "server" AutoGenerateColumns = "false"
             ModelType = "WebApplication2.NorthwindService.Supplier"
             SelectMethod = "GetProducts">
         <Колонки>
             <asp: TemplateField HeaderText = "Name">
                 <ItemTemplate>
                     <asp: Label ID = "lblName" runat = "server" Text = '<% # Item.Name%>'> </ asp: Label>
                 </ ItemTemplate>
             </ Жерех: TemplateField>
             <asp: TemplateField HeaderText = "Город">
                 <ItemTemplate>
                     <asp: Label ID = "lblCity" runat = "server" Text = '<% # Item.Address.City%>'> </ asp: Label>
                 </ ItemTemplate>
             </ Жерех: TemplateField>
         </ Columns>
     </ Жерех: GridView> 

А в приведенном ниже коде есть метод GetProducts:

  public IQueryable <NorthwindService.Supplier> GetProducts ()
 {
     var service = new NorthwindService.DemoService (новый Uri (@ "http://services.odata.org/OData/OData.svc/"));
     Var поставщики = (из р в сервисе. Поставщики
                              выберите p);
     возврат поставщиков;
 } 

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

Я в восторге от привязки модели и строго связанных элементов управления данными в ASP.NET 4.5. Он определенно позаимствовал эти идеи и концепции у MVC, поэтому скрестив пальцы, многие из них будут реализованы в следующих версиях.

Код этой статьи можно скачать здесь .