Пошаговое руководство. Включение динамических данных в элементах управления ASP.NET с привязкой к данным

В этом руководстве описан способ интеграции функций платформы динамических данных в элементе управления с привязкой к данным без использования функции формирования шаблонов или частичных элементов функции формирования шаблонов. Этот подход оптимален при наличии существующего веб-сайта и необходимости добавления динамического поведения к элементам управления с привязкой к данным.

Для доступа к базе данных можно использовать элемент управления ObjectDataSource и при этом применять функции платформы динамических данных. Этот способ заменяет использование элементов управления LinqDataSource и EntityDataSource с веб-сайтами платформы динамических данных, зависимыми от системы формирования шаблонов. В этом руководстве будет создан настраиваемый бизнес-класс, с которым взаимодействует элемент управления ObjectDataSource для предоставления данных из определенной таблицы примера базы данных AdventureWorks.

В этом разделе описаны следующие задачи:

  • Включение платформы динамических данных в элементе управления GridView с привязкой к данным.

  • Взаимодействие с исходной базой данных с помощью элемента управления ObjectDataSource.

  • Отображение указанной таблицы в элементе управления GridView и обеспечение возможности обновления строк в таблице пользователями.

В этом разделе содержатся следующие подразделы.

Для выполнения примера в этом разделе необходимы следующие компоненты.

Посмотрите Watch Enabling Dynamic Data, в котором демонстрируется эта функция.

Проект Visual Studio с исходным кодом этого примера доступен на следующей странице: Enabling Dynamic Data.

Вначале будет создан веб-сайт ASP.NET, который не является веб-приложением платформы динамических данных.

Чтобы создать веб-приложение ASP.NET, выполните следующие действия:

  1. Запустите Visual Studio.

  2. В меню Файл выберите команду Создать, затем выберите пункт Проект.

    Откроется диалоговое окно Создать проект.

  3. В разделе Установленные шаблоны на левой панели щелкните элемент Visual Basic или Visual C#, а затем выберите Веб.

  4. В группе Установленные шаблоны выберите пункт Веб-приложение АSP.NET.

  5. В поле Расположение введите имя папки, в которой будет храниться веб-приложение. Например, введите имя папки C:\WebApplications\EnableDynamicData.

  6. Нажмите кнопку ОК.

Следующим шагом является добавление базы данных.

Добавление базы данных к веб-приложению

  1. В Обозревателе решений щелкните правой кнопкой мыши папку App_Data и выберите команду Добавить существующий элемент.

  2. В диалоговом окне Добавление существующего элемента укажите расположение файла базы данных AdventureWorksLT (AdventureWorksLT.mdf), после чего нажмите кнопку Добавить.

    В проекте будет создана копия файла базы данных. Дополнительные сведения см. в разделе Практическое руководство. Подключение к базе данных AdventureWorksLT с помощью MDF-файла.

Теперь можно приступить к созданию модели данных, которая содержит классы, представляющие таблицы баз данных. Платформа динамических данных использует эти классы для взаимодействия с базой данных. В этом пошаговом руководстве будет использоваться модель данных LINQ-to-SQL. Однако вместо нее можно использовать модель данных ADO.NET Entity Framework. Эти классы можно также создать вручную без использования средства моделирования данных, хотя этот процесс не показан в руководстве.

Создание модели данных

  1. В окне Обозреватель решений щелкните имя проекта правой кнопкой мыши и нажмите кнопку Добавить.

  2. Щелкните пункт Новый элемент для его выбора.

  3. В разделе Установленные шаблоны на левой панели выберите узел Данные.

  4. На центральной панели выберите элемент Классы LINQ to SQL.

  5. В поле Имя введите название модели базы данных AdventureWorksLT.dbml.

  6. Нажмите кнопку Добавить.

    Откроется реляционный конструктор объектов. Дополнительные сведения см. в разделе Реляционный конструктор объектов.

  7. В реляционном конструкторе объектов щелкните ссылку Обозреватель серверов.

  8. В Обозревателе серверов в разделе Подключения данных разверните узел AdventureWorksLT_Data.mdf, после чего разверните узел Таблицы.

  9. Выберите все таблицы и перетащите их в окно реляционного конструктора объектов.

  10. В отображенной диаграмме выберите все столбцы таблицы SalesOrdersDetail.

  11. В связанном окне "Свойства" установите для свойства Проверка обновлений значение Никогда.

  12. Закройте обозреватель серверов.

  13. Сохраните и закройте файл AdventureWorksLT.dbml.

    Вы создали модель данных, представляющую базу данных AdventureWorksLT.

Теперь необходимо создать код, который позволяет приложению обращаться к сведениям базы данных и обрабатывать их. (В веб-приложении платформы динамических данных эта логика будет создана автоматически. В данном руководстве показан процесс создания кода, используемого вместе с элементом управления ObjectDataSource). В этом руководстве настраиваемая логика состоит из методов отображения и изменения полей данных, которые содержатся в таблице SalesOrderDetail.

Создание пользовательской логики для доступа к определенной таблице

  1. В окне Обозреватель решений щелкните имя проекта правой кнопкой мыши и выберите команду Добавить.

  2. Щелкните пункт Новый элемент для его выбора.

  3. В разделе Установленные шаблоны на левой панели щелкните элемент Код.

  4. На центральной панели щелкните элемент Файл исходного кода.

  5. Перейдите к полю Имя и введите в него ProcessingOrderDetails.vb или ProcessingOrderDetails.cs, а затем нажмите кнопку Добавить.

  6. Скопируйте следующий код в новый класс, заменив весь код файла.

    Imports System
    Imports System.Collections.Generic
    Imports System.Linq
    Imports System.Web
    
    Namespace EnableDynamicData
      Public Class ProcessingOrderDetails
        Public Function GetSalesOrderDetails() As IEnumerable( _
          Of SalesOrderDetail)
          Using db As New AdventureWorksLTDataContext()
            Return db.SalesOrderDetails.ToList()
          End Using
        End Function
    
        Public Sub Update(ByVal p As SalesOrderDetail)
          Using db As New AdventureWorksLTDataContext()
            db.SalesOrderDetails.Attach(p, True)
            db.SubmitChanges()
          End Using
        End Sub
      End Class
    End Namespace
    

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    namespace EnableDynamicData
    {
      public class ProcessingOrderDetails
      {
        public IEnumerable<SalesOrderDetail> GetSalesOrderDetails()
        {
          using (AdventureWorksLTDataContext db = 
             new AdventureWorksLTDataContext())
          {
            return db.SalesOrderDetails.ToList();
           }
        }
    
        public void Update(SalesOrderDetail p)
        {
          using (AdventureWorksLTDataContext db = 
            new AdventureWorksLTDataContext())
            {
              db.SalesOrderDetails.Attach(p, true);
              db.SubmitChanges();
            }
        }
      }
    }
    

    Класс содержит следующие методы.

    • GetSalesOrderDetails. Этот метод возвращает строки данных из таблицы SalesOrderDetail. Метод создает экземпляр объекта контекста базы данных, а затем использует класс SalesOrderDetails для получения коллекции строк.

    • Update. Этот метод изменяет значение столбца в таблице SalesOrderDetail. Метод создает экземпляр объекта контекста базы данных, а затем записывает изменения таблицы SalesOrderDetail в базу данных.

  7. Сохраните и закройте файл.

  8. Для выполнения построения откройте меню Построение, выберите команду Построить EnableDynamicData (или другое имя, используемое для веб-приложения).

    Это подготавливает бизнес-объект для следующей процедуры.

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

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

Добавление веб-страницы и элемента управления источником данных

  1. В окне Обозреватель решений щелкните имя проекта правой кнопкой мыши и выберите команду Добавить.

  2. Выберите команду Создать элемент.

  3. В разделе Установленные шаблоны на левой панели щелкните элемент Веб.

  4. На центральной панели щелкните элемент Веб-форма.

  5. В текстовом поле Имя введите EnableDynamicData.aspx и нажмите кнопку Добавить.

  6. Перейдите в представление Конструктор.

  7. Из группы ДанныеПанели элементов добавьте на страницу элемент управления ObjectDataSource.

  8. В меню Задачи ObjectDataSource выберите команду Настройка источника данных.

    Отобразится диалоговое окно Выбор бизнес-объекта.

  9. В списке Выбор бизнес-объекта выберите класс ProcessingOrderDetails, созданный в предыдущей процедуре.

  10. Нажмите кнопку Далее.

    Откроется диалоговое окно Задайте методы данных.

  11. В списке Выбор метода на панели вкладки Выбор выберите метод GetSalesOrderDetails.

  12. Выберите вкладку Обновление.

  13. В списке Выбор метода на панели вкладки Обновление выберите метод Update.

  14. Нажмите кнопку Готово.

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

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

Настройка элемента управления с привязкой к данным для использования функций платформы динамических данных

  1. Из группы ДанныеПанели элементов добавьте на страницу элемент управления GridView.

  2. В меню Задачи GridView перейдите к списку Выбор источника данных и выберите элемент ObjectDataSource1.

    Это идентификатор элемента управления ObjectDataSource, созданного в предыдущей процедуре.

  3. Включите разбиение на страницы, редактирование и выделение.

  4. Перейдите в представление Исходный код.

  5. Перейдите к элементу управления GridView в элемент Columns и удалите все элементы управления DataBoundField, созданные автоматически. Не удаляйте элемент CommandField.

  6. Включите автоматическое создание столбцов путем задания для атрибута AutoGenerateColumns значения true, как показано в следующем примере:

    <asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
      DataSourceID="ObjectDataSource1" AutoGenerateColumns="True" >
        <Columns>
          <asp:CommandField 
            ShowEditButton="True" ShowSelectButton="True" /> 
        </Columns>
    </asp:GridView>
    
  7. Сохраните изменения и закройте файл EnableDynamicData.aspx.

  8. Откройте файл класса EnableDynamicData.aspx.vb или EnableDynamicData.aspx.cs.

  9. Добавьте ссылку на пространства имен System.Web.DynamicData, как показано в следующем примере:

    Imports System.Web.DynamicData
    

    using System.Web.DynamicData
    
  10. Перейдите к методу Page_Init и включите платформу динамических данных для элемента управления GridView, как показано в следующем примере:

    Private Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
        GridView1.EnableDynamicData(GetType(SalesOrderDetail))
    End Sub
    

    protected void Page_Init()
      {
        GridView1.EnableDynamicData(typeof(SalesOrderDetail));
      }
    
  11. Сохраните и закройте файл.

  12. Перестройте приложение.

В этом разделе описано тестирование интеграции функций платформы динамических данных в элемент управления GridView путем проверки следующих аспектов:

  • Пользовательская бизнес-логика корректным образом взаимодействует с базой данных.

  • Для изменений полей данных выполняется проверка динамических данных.

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

Тестирование функций платформы динамических данных

  1. В Обозревателе решений щелкните правой кнопкой мыши страницу EnableDynamicData.aspx, после чего выберите команду Просмотр в браузере.

    В браузере будет отображена страница, содержащая таблицу SalesOrderDetail.

  2. Убедитесь в том, что отображаются корректные поля данных SalesOrderDetails.

  3. Выберите команду Изменить в любой из строк и введите нечисловое значение для столбца UnitPrice.

  4. В той же строке щелкните Обновить.

    Платформа динамических данных отобразит сообщение об ошибке, которое предупреждает о том, что поле UnitPrice должно иметь десятичное значение. Обратите внимание на то, что пользовательский интерфейс, используемый для редактирования, основан на шаблоне платформы динамических данных по умолчанию.

  5. В той же строке щелкните Отмена.

  6. Выберите команду Изменить для любой строки и замените значение в столбце OrderQty на значение, меньшее или равное максимальному целому значению, разрешенному в базе данных (32767).

  7. В той же строке щелкните Обновить.

    Платформа динамических данных обновит базу данных. Так как введено верное значение, данные проходят проверку платформы динамических данных.

  8. Выберите команду Изменить для любой строки и замените значение в столбце OrderQty на значение, превышающее максимальное целое значение, разрешенное в базе данных (32767).

  9. В той же строке щелкните Обновить.

    Платформа динамических данных отображает сообщение о вводе недействительного значения.

  10. В той же строке щелкните Отмена.

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

  11. Закройте браузер.

В этом разделе руководства в схему базы данных будет добавлена настраиваемая информация (метаданные). Платформа динамических данных использует метаданные при обработке полей данных. Например, разработчик может определить диапазон значений для поля данных, отличный от диапазона, разрешенного базой данных. В этом руководстве будет добавлена пользовательская информация, требующая наличия значения UnitPrice, которое не является обязательным полем базы данных, а также будет задан диапазон значений OrderQty.

Предоставление пользовательских метаданных

  1. В Обозревателе решений щелкните правой кнопкой мыши имя проекта и выберите команду Добавить ссылку.

    Появится диалоговое окно Добавление ссылки.

  2. Перейдите на вкладку .NET.

  3. Выберите из списка пункт System.ComponentModel.DataAnnotations.

  4. Нажмите кнопку ОК.

  5. Откройте файл EnableDynamicData.aspx.vb или EnableDynamicData.aspx.cs.

  6. Скопируйте следующий код в этот файл, заменив весь существующий код.

    Imports System.ComponentModel.DataAnnotations
    
    Namespace EnableDynamicData
      <MetadataType(GetType(SalesOrderDetailMetadata))> _
      Partial Public Class SalesOrderDetail
        Public Class SalesOrderDetailMetadata
          Private privateUnitPrice As String
          <Required()> _
          Public Property UnitPrice() As String
            Get
              Return privateUnitPrice
            End Get
            Set(ByVal value As String)
              privateUnitPrice = value
            End Set
          End Property
    
          Private privateOrderQty As Decimal
            <Range(0, 100)> _
            Public Property OrderQty() As Decimal
              Get
                Return privateOrderQty
              End Get
              Set(ByVal value As Decimal)
                privateOrderQty = value
              End Set
            End Property
        End Class
      End Class
    
    End Namespace
    

    using System.ComponentModel.DataAnnotations;
    
    namespace EnableDynamicData
    {
      [MetadataType(typeof(SalesOrderDetailMetadata))]
      public partial class SalesOrderDetail
      {
        public class SalesOrderDetailMetadata
        {
          [Required]
          public string UnitPrice { get; set; }
    
          [Range(0, 100)]
          public decimal OrderQty { get; set; }
    
        }
      }
    
         
    }
    

    Этот код создает два класса: разделяемый класс SalesOrderDetail и класс SalesOrderDetailMetadata внутри него.

    Эти классы расширяют модель данных и позволяют выполнять следующие задачи:

    • Добавить метаданные к полю данных UnitPrice, которые запрещают наличие пустых значений. (База данных AdventureWorks разрешает пустые значения для поля данных UnitPrice). Платформа динамических данных выведет сообщение об ошибке при попытке ввода пустого значения.

    • Добавить метаданные к полю данных OrderQty, чтобы задать разрешенный диапазон. База данных AdventureWorks не имеет ограничений диапазона для поля данных OrderQty. Платформа динамических данных выведет сообщение об ошибке при попытке ввода значения, не входящего в разрешенный диапазон.

    Подобное использование разделяемых классов позволяет гибко изменять поведение модели данных без ее непосредственного редактирования.

  7. Сохраните и закройте файл.

В этом разделе описано тестирование проверки предоставленных метаданных в платформе динамических данных. Проверяются следующие действия платформы динамических данных:

  • Проверка изменений полей данных в зависимости от пользовательских метаданных выполняется корректно.

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

Тестирование проверки пользовательских динамических данных

  1. В Обозревателе решений щелкните правой кнопкой мыши страницу EnableDynamicData.aspx, после чего выберите команду Просмотр в браузере.

    В браузере будет отображена страница, содержащая таблицу SalesOrderDetails.

  2. В любой строке выберите команду Изменить и удалите значение в столбце UnitPrice.

  3. В той же строке щелкните Обновить.

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

  4. В той же строке щелкните Отмена.

  5. В любой строке выберите команду Изменить и замените значение в столбце OrderQty на значение в разрешенном диапазоне, например 25.

  6. В той же строке щелкните Обновить.

    Платформа динамических данных обновит базу данных. Так как введено верное значение, данные проходят проверку.

  7. В любой строке выберите команду Изменить и замените значение в столбце OrderQty на значение вне разрешенного диапазона, например 250.

  8. В той же строке щелкните Обновить.

    Платформа динамических данных отобразит сообщение об ошибке, которое предупреждает о том, что значение поля должно быть в диапазоне от 0 до 100. Эти действия позволяют убедиться в успешности интеграции проверки динамических данных с элементом управления GridView, а также в том, что при проверке используются пользовательские метаданные.

  9. В той же строке щелкните Отмена.

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

Чтобы получить общие сведения, можно сделать следующее.

Показ: