• Microsoft .NET
  • ASP.NET
  • Создание динамического пользовательского интерфейса ASP.NET, управляемого данными

Создание динамического пользовательского интерфейса ASP.NET, управляемого данными - Метод CreateCustomAttributeUI и вспомогательные методы, вызванные в пределах процесса

ОГЛАВЛЕНИЕ

Метод CreateCustomAttributeUI и вспомогательные методы, вызванные в пределах процесса

Private Function CreateCustomAttributeUI(ByVal DynamicAttributeId As Guid, ByVal DataTypeId As DataTypeIdEnum, ByVal AttributeValue As Object) As List(Of Control)
   Dim ctrls As New List(Of Control)

   Select Case DataTypeId
      Case DataTypeIdEnum.String
         'Используем TextBox
         Dim stringValue As String = String.Empty
         If Not Convert.IsDBNull(AttributeValue) Then
            stringValue = AttributeValue.ToString()
         End If

         Dim tb As New TextBox
         tb.ID = GetID(DynamicAttributeId)
         tb.Text = stringValue
         tb.TextMode = TextBoxMode.MultiLine
         tb.Columns = 50
         tb.Rows = 5
         ctrls.Add(tb)

      Case DataTypeIdEnum.Boolean
         'Используем checkbox
         Dim checkedState As Boolean = False
         If Not Convert.IsDBNull(AttributeValue) Then
            checkedState = Convert.ToBoolean(AttributeValue)
         End If

         Dim cb As New CheckBox
         cb.ID = GetID(DynamicAttributeId)
         cb.Checked = checkedState
         ctrls.Add(cb)

      Case DataTypeIdEnum.Numeric
         'Используем TextBox
         Dim doubleValue As String = String.Empty
         If Not Convert.IsDBNull(AttributeValue) Then
            doubleValue = Convert.ToDouble(AttributeValue)
         End If

         Dim tb As New TextBox
         tb.ID = GetID(DynamicAttributeId)
         tb.Columns = 5
         tb.Text = doubleValue
         ctrls.Add(tb)

         'и числовое значение CompareValidator
         ctrls.Add(CreateDataTypeCheckCompareValidator(DynamicAttributeId, ValidationDataType.Double, "Invalid numeric value."))

      Case DataTypeIdEnum.Date
         'Используем TextBox
         Dim dateValue As String = String.Empty
         If Not Convert.IsDBNull(AttributeValue) Then
            dateValue = Convert.ToDateTime(AttributeValue).ToShortDateString()
         End If

         Dim tb As New TextBox
         tb.ID = GetID(DynamicAttributeId)
         tb.Columns = 10
         tb.Text = dateValue
         ctrls.Add(tb)

         'И дату CompareValidator
         ctrls.Add(CreateDataTypeCheckCompareValidator(DynamicAttributeId, ValidationDataType.Date, "Invalid date value."))
   End Select

   Return ctrls
End Function


Private Function CreateDataTypeCheckCompareValidator(ByVal DynamicAttributeId As Guid, ByVal DataType As ValidationDataType, ByVal ErrorMessage As String) As CompareValidator
   Dim cv As New CompareValidator
   cv.ID = "CompVal_" & GetID(DynamicAttributeId)
   cv.ControlToValidate = GetID(DynamicAttributeId)
   cv.Display = ValidatorDisplay.Dynamic
   cv.Operator = ValidationCompareOperator.DataTypeCheck
   cv.Type = DataType
   cv.ErrorMessage = ErrorMessage

   Return cv
End Function


Private Function GetID(ByVal DynamicAttributeId As Guid) As String
   Return DynamicAttributeId.ToString().Replace("-", "_")
End Function

Стоит отметить кое-что до того, как мы продолжим. Во-первых, заметьте, что каждый элемент управления, добавленный к странице, имеет настроенное свойство ID. Это выполняется позже - когда мы обновляем базу данных пользовательским вводом, нам необходимо осуществить программный доступ к элементам управления. Поэтому, ID установлен в первичный ключ таблицы DynamicAttributesForClients, DynamicAttributeId. Данная колонка является uniqueidentifier, что эквивалентно типу Guid в .NET Framework. Класс Guid имеет метод ToString(), который преобразует значение в строку типа 37146444-9d4c-4306-bc4a-fdab87911015. Тем не менее, дефисы могут вызвать некоторые проблемы при выработке скрипта клиентской части элементами управления CompareValidator. Поэтому я создал и использую метод GetID при назначении значения ID элемента. Метод GetID преобразует Guid в строку и заменяет все дефисы символами подчеркивания.

Другим аспектом, который стоит принять во внимание, является то, что при работе с AttributeValue нам сначала надо удостовериться в том, что он эквивалентен значению NULL базы данных до того, как назначать значение элементу управления. Это потому, что может не существовать соответствующей записи в DynamicValuesForClients для всех специализированных клиентских атрибутов. К примеру, если клиент был только что создан, но для него не был определен ни  один специализированный клиентский атрибут, то тогда запрос SELECT, используемый для выборки специализированных клиентских атрибутов, возвратит NULL.

Следующее изображение демонстрирует страницу ~/Customers/ClientCustomAttributes.aspx при посещении пользователем, который пока что не имеет ни одного указанного специализированного атрибута. Данный пользователь - Hutz and Hutz - имеет пять специализированных клиентских атрибутов:

  • Birthdate (Date) - дата рождения
  • Employed (Boolean) - дата зачисления в компанию
  • Married (Boolean) - дата свадьбы
  • Number of Years at Current Job (Numeric) - количество лет работы на текущей позиции
  • Reason for Law Suit (String) - причина открытия иска

Обратите внимание на то, что каждый пользовательский интерфейс специализированных клиентских атрибутов является специфичным для своего типа. Атрибуты типа Boolean обрабатываются как CheckBox, в то время как атрибуты типа String обрабатываются как многострочные элементы TextBox.