Пошаговое руководство. Настройка внешнего вида и поведения полей данных в модели данных

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

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

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

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

  • Создание двух пользовательских шаблонов полей. Одно из них служит для отображения данных, а другое — для предоставления пользовательского интерфейса редактирования данных. Эти шаблоны будут использоваться платформой динамических данных для того, чтобы отобразить пользовательский интерфейс поля данных.

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

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

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

К этому моменту будет создано два пользовательских шаблона поля: один для отображения данных, а другой — для отображения пользовательского интерфейса редактирования данных. Эти шаблоны будут использоваться для настройки пользовательского интерфейса поля данных OrderQty, содержащегося в таблице SalesOrderDetail базы данных AdventureWorks.

Создание шаблона отображения

Шаблон, создаваемой в этой процедуре, отображает данные по-разному в зависимости от значения данных. Если значение равно минимальному порогу или меньше его, значение числа заказов отображается красным цветом. Если значение равно максимальному порогу или превышает его, значение числа заказов отображается синим цветом.

Чтобы создать пользовательский шаблон полей для отображения

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

  2. В группе Установленные шаблоны в левой области выберите предпочтительный язык программирования.

  3. В центральной области щелкните Поле динамических данных.

  4. Введите имя для пользовательского шаблона полей в поле Имя. Можно использовать любое имя, которое еще не используется шаблонами по умолчанию. Например, можно ввести имя OrderQty.ascx.

  5. Убедитесь, что флажок Поместить код в отдельный файл установлен.

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

    Visual Studio создает файлы OrderQty.ascx и OrderQty_Edit.ascx. Первый шаблон отображает пользовательский интерфейс для отображения поля данных, а второй шаблон — пользовательский интерфейс для редактирования поля данных.

  7. Откройте файл OrderQty.ascx.

  8. Удалите элемент управления Literal, являющийся частью шаблона, предоставленного платформой динамических данных.

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

  10. Из группы Стандартные панели элементов добавьте на страницу элемент управления Label.

  11. В окне Свойства задайте для значения свойства Text элемента управления Label следующее выражение:

    <%# FieldValueString %>
    
  12. Перейдите в представление Исходный код.

    В следующем примере показана разметка для созданного элемента управления.

    <asp:Label id="Label1" 
        runat="server" 
        Text="<%# FieldValueString %>"
    >
    </asp:Label>
    

    Эта разметка предоставляет элементу управления Label доступ к значению поля данных через свойство FieldValueString.

  13. Сохраните файл OrderQty.ascx и закройте его.

  14. Откройте файл класса OrderQty.ascx.cs или OrderQty.ascx.vb.

  15. В переопределенном методе DataControl замените идентификатор Literal1 идентификатором Label1.

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

    public override Control DataControl {
      get {return Label1;}
    }
    

    Public Overrides ReadOnly Property DataControl() As Control
      Get
        Return Label1
      End Get
    End Property
    
  16. Переопределите метод OnDataBinding и добавьте следующий код для настройки отображения поля данных.

    protected override void OnDataBinding(EventArgs e)
    {
      // Read the quantity value.
      Int16 currentQty = (Int16)FieldValue;
      if (FieldValue != null)
      {
        // Set quantity stock thresholds.
        int min = 30;
        int max = 1500;
        if (currentQty <= min)
        {
          // Quantity is less than the minimum 
          // stock threshold.
          Label1.ForeColor = System.Drawing.Color.Red;
          Label1.Font.Bold = true;
        }
        else
          if (currentQty >= max)
          {
            // Quantity is greater than the maximum 
            // stock threshold.
            Label1.ForeColor = System.Drawing.Color.Blue;
            Label1.Font.Bold = true;
          }
      }
    }
    

    Protected Overloads Overrides Sub OnDataBinding(ByVal e As EventArgs)
      ' Read quantity value.
      Dim currentQty As Int16 = DirectCast(FieldValue, Int16)
      If FieldValue <> Nothing Then
        'Set quantity stock thresholds.
        Dim min As Integer = 30
        Dim max As Integer = 1500
        If currentQty <= min Then
          ' Quantity is less than the minimum
          ' stock threshold.
          Label1.ForeColor = System.Drawing.Color.Red
          Label1.Font.Bold = True
        ElseIf currentQty >= max Then
          ' Quantity is greater than the maximum 
          ' stock threshold.
          Label1.ForeColor = System.Drawing.Color.Blue
          Label1.Font.Bold = True
        End If
      End If
    End Sub
    

    В этом методе доступа значение текущего поля данных извлекается с помощью свойства FieldValue.

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

Создание шаблона изменения

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

Чтобы создать пользовательский шаблон полей для редактирования

  1. Откройте файл OrderQty_Edit.ascx.

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

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

  4. В окне Свойства присвойте свойству Display значение Dynamic.

  5. Задайте для свойства ControlToValidate значение TextBox1.

  6. В окне Свойства панели инструментов окна нажмите кнопку События.

  7. Задайте для свойства ServerValidate значение OrderQtyValidadtion, являющееся именем пользовательского обработчика проверки, который будет создан позднее.

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

    В следующем примере показана разметка для созданного элемента управления.

    <asp:CustomValidator id="CustomValidator1" runat="server" 
      ControlToValidate="TextBox1" Display="Dynamic"
      OnServerValidate="OrderQtyValidadtion" />
    
  9. Сохраните файл OrderQty_Edit.ascx и закройте его.

  10. Откройте файл класса OrderQty.ascx_edit.cs или OrderQty.ascx_Edit.vb.

  11. Скопируйте следующий код в файл класса, чтобы создать пользовательский обработчик для элемента управления CustomValidator.

    protected void OrderQtyValidation(object source, 
        ServerValidateEventArgs args)
    {
      bool result = false;
      short intUnits;
      // Convert the user's input into an integer.
      result = Int16.TryParse(TextBox1.Text, out intUnits); 
      if (result == true)
      {
        result = CheckRange(intUnits);
        // Return result.
        args.IsValid = result;
      }
      else
      {
        CustomValidator1.ErrorMessage = string.Format(
          "The value is greater than the maximum integer.");
        args.IsValid = result;
      }
    }
    
    protected bool CheckRange(int intUnits)
    {
      bool result = true;
      // Set quantity range limits.
      int min = 10;
      int max = 2000;
      // Check whether the value is in the allowed range.
      if (intUnits < min)
      {
        CustomValidator1.ErrorMessage = string.Format(
          "Value is less than the minimum threshold: {0} ", min);
           result = false;
      }
      else
        if (intUnits > max)
        {
          CustomValidator1.ErrorMessage = string.Format(
            "Value is greater than the maximum threshold: {0} ", max);
          result = false;
        }
        return result;
    }
    

    Protected Sub OrderQtyValidation(ByVal source As Object, _
      ByVal args As ServerValidateEventArgs)
      Dim result As Boolean = False
      ' Convert the user's input into an integer.
      result = Int16.TryParse(TextBox1.Text, out intUnits)
      If result = True Then
        ' Check whether the input is in the allowed range.
        result = CheckRange(intUnits)
        ' Return result.
        args.IsValid = result
      Else
        CustomValidator1.ErrorMessage = _
          String.Format("The value is greater than the maximum integer.")
        args.IsValid = result
      End If
    End Sub
    
    Protected Function CheckRange(ByVal intUnits As Integer) As Boolean
      Dim result As Boolean = True
    
      ' Set quantity range limits.
      Dim min As Integer = 10
      Dim max As Integer = 2000
    
      ' Check whether the value is in the allowed range.
      If intUnits < min Then
        CustomValidator1.ErrorMessage = _
          String.Format("Value is greater than the minimum threshold: {0} ", min)
        result = False
      ElseIf intUnits > max Then
        CustomValidator1.ErrorMessage = _
          String.Format("Value is greater than the maximum threshold: {0} ", max)
        result = False
      End If
      Return result
    End Function
    

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

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

В этом разделе создается разделяемый класс. Этот класс расширяет модель данных и позволяет связать пользовательский шаблон поля с конкретным полем данных.

Создание разделяемого класса

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

  2. В левой области группы Установленные шаблоны выберите язык программирования.

  3. В центральной области выберите пункт Класс .

  4. В поле Имя введите SalesOrderDetail.cs или SalesOrderDetail.vb.

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

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

    Visual Studio открывает новый файл класса.

  6. Добавьте ключевое слово Partial (Visual Basic) или ключевое слово partial (C#) в определение класса, чтобы сделать его разделяемым, как показано в следующем примере.

    public partial class SalesOrderDetail
    {
        
    }
    

    Partial Public Class SalesOrderDetail
        
    End Class 
    
  7. В случае использования языка C# удалите конструктор по умолчанию.

  8. Импортируйте пространства имен System.Web.DynamicData и System.ComponentModel.DataAnnotations, используя ключевое слово Imports (Visual Basic) или ключевое слово using (C#), как показано в следующем примере.

    using System.Web.DynamicData;
    using System.ComponentModel.DataAnnotations;
    

    Imports System.Web.DynamicData
    Imports System.ComponentModel.DataAnnotations 
    
  9. В файле класса добавьте приведенный ниже код, чтобы создать еще один разделяемый класс, который будет выступать в качестве связанного класса метаданных. Для класса можно использовать любое имя.

    public partial class SalesOrderDetailMetadata
    {
        
    }
    

    Partial Public Class SalesOrderDetailMetadata
        
    End Class 
    
  10. Добавьте атрибут MetadataTypeAttribute в класс SalesOrderDetail. Задайте в качестве параметра имя только что созданного метакласса (например, SalesOrderDetailMetadata), как показано в следующем примере.

    [MetadataType(typeof(SalesOrderDetailMetadata))]
    public partial class SalesOrderDetail 
    {
        
    }
    

    <MetadataType(GetType(SalesOrderDetailMetadata))> _
    Partial Public Class SalesOrderDetail 
        
    End Class
    

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

  11. Сохраните файл, но не закрывайте его.

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

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

  1. В классе метаданных создайте открытое свойство с именем OrderQty (соответствующее настраиваемому полю данных), как показано в следующем примере.

    public partial class SalesOrderDetailMetadata
    {    
      public object OrderQty;
    }
    

    Partial Public Class SalesOrderDetailMetadata
      Public OrderQty As Object
    End Class 
    

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

  2. Добавьте к свойству атрибут UIHintAttribute и задайте имя применяемого пользовательского шаблона поля (OrderQty), как показано в следующем примере.

    public partial class SalesOrderDetailMetadata
    {    
      [UIHint("OrderQty")]
      public object OrderQty;
    }
    

    Partial Public Class SalesOrderDetailMetadata
      <UIHint("OrderQty")> _
      Public OrderQty As Object
    End Class 
    
  3. Сохраните и закройте файл.

Теперь можно проверить приведенное ниже поведение пользовательского шаблона.

  • Пользовательский шаблон используется во время отображения или изменения значений в поле OrderQty.

  • Шаблон поля OrderQty.ascx отображает значение поля красным цветом, если значение OrderQty равно минимальному биржевому порогу или меньше его. Шаблон отображает значение синим цветом, если оно равно максимальному биржевому порогу или превышает его.

  • Шаблон поля OrderQty_Edit.ascx проверяет, попадает ли введенное пользователем значение OrderQty в абсолютные границы диапазона. Если введенное пользователем значение находится за пределами допустимого диапазона, отображается настроенное сообщение об ошибке.

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

  1. В обозревателе решений щелкните правой кнопкой мыши страницу Default.aspx и выберите команду Просмотреть в обозревателе.

  2. В отображаемом списке таблиц щелкните ссылку SalesOrderDetails.

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

  3. В любой из строк нажмите кнопку Изменить.

  4. Для столбца OrderQty введите значение, меньшее минимального биржевого порога (30), например 25.

  5. В той же строке нажмите кнопку Обновить.

    Платформа динамических данных отображает введенное значение красным цветом. Это означает, что введенное значение меньше минимального биржевого порога.

  6. В любой из строк нажмите кнопку Изменить.

  7. Для столбца OrderQty введите значение, большее минимального биржевого порога, но меньшее максимального биржевого порога(1500), например 250.

  8. В той же строке нажмите кнопку Обновить.

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

  9. В любой из строк нажмите кнопку Изменить.

  10. Для столбца OrderQty введите значение, большее максимального биржевого порога (1500), например 1800.

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

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

  12. В любой из строк нажмите кнопку Изменить.

  13. Для столбца OrderQty введите значение, меньшее минимального значения (10), например 5.

  14. В той же строке нажмите кнопку Обновить.

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

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

  16. В любой из строк нажмите кнопку Изменить.

  17. Для столбца OrderQty введите значение, большее максимального значения (2000), например 2800.

  18. В той же строке нажмите кнопку Обновить.

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

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

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

Показ: