Создание динамического пользовательского интерфейса 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.
