Создание динамического пользовательского интерфейса ASP.NET, управляемого данными - Специализированные атрибуты, позволяющие выбрать опцию из списка
ОГЛАВЛЕНИЕ
Специализированные атрибуты, позволяющие выбрать опцию из списка
Каждый специализированный атрибут, созданный пользователем должен иметь тип данных. Тип данных определяет способ обработки интерфейса атрибута. В первой статье данной серии мы определили четыре типа данных в таблице DynamicAttributeDataTypes:
- String
- Boolean
- Numeric
- Date
Для того, чтобы использовать тип данных "pick list" нам необходимо разрешить пользователям указать набор опций выбора для определенного специализированного атрибута. Для того, чтобы сохранить данный набор вариантов нам необходимо добавить новую таблицу к базе данных. Я создал таблицу DynamicPickListOptions со следующей структурой:
Column Name | Data Type | Описание |
---|---|---|
DynamicPickListOptionID | uniqueidentifier | Первичный ключ; значение по умолчанию - NEWID() |
AttributeId | uniqueidentifier | Внешний ключ к DynamicAttributesForClients.DynamicAttributeId |
DisplayText | nvarchar(50) | Текст, который необходимо отобразить в элементе выпадающего списка |
OptionValue | nvarchar(50) | Значение, ассоциируемое с элементом выпадающего списка |
SortOrder | int |
Колонка AttributeId связывает список вариантов со специализированными атрибутами. К примеру, представьте себе специализированный клиентский атрибут под названием "Payment Options" (Способ оплаты). Если существует три варианта - Pro Bono, On Retainer и Paid/Hour, то в таблице DynamicPickListOptions будет три записи, все указывающие обратно на тот же атрибут - "Payment Options."
OptionValue предназначен для ассоциации дополнительной информации с определенным элементом выпадающего списка. Данная колонка пригода для ответов или других действий. Она не используется напрямую с целью указания выбранного значения. Вместо нее используется значения колонки DynamicPickListOptionID. К примеру, если определенный клиент осуществляет почасовую оплату, и опция Paid/Hour в DynamicPickListOptions имеет значение DynamicPickListOptionID равное of 0477a3a3-4793-4247-8b37-ad756b8cd367, то тогда в таблице DynamicValuesForClientsDynamicValue будет равно 0477a3a3-4793-4247-8b37-ad756b8cd367. Значение колонки OptionValue для Paid/Hour не играет никакой роли. будет запись, чье значение колонки
Пользовательский интерфейс для определения специализированных клиентских атрибутов должен быть обновлен. В частности, нам необходима страница, где пользователь может определить варианты для определенного атрибута типа списка. Для этого я добавил новую страницу к веб-приложению в каталоге Customers под названием EditPickListOptions.aspx. Используя строку запроса данной странице передается DynamicAttributeId того атрибута, чьи варианты необходимо обработать, и затем отображаются DetailsView и GridView, позволяющие вставку, обновление и удаление вариантов списка выбора. Данная страница в действии отображена в следующем изображении.
![](/images/stories/dotnet/aspnet-datadriven-ui/12.gif
)
Я также обновил страницу DefineClientAttributes.aspx и она теперь включает в себя ссылку в GridView с названием "Edit Pick List Options" (Редактировать варианты списка выбора), которая ссылается на EditPickListOptions.aspx?ID=DynamicAttributeID. Эта ссылка отображается только для атрибутов типа "Pick List."
Вдобавок я обновил методы CreateCustomAttributeUI и GetValueForCustomAttribute в ClientCustomAttributes.aspx - эти методы используются для динамического создания пользовательского интерфейса и соотвественно возврата значений, введенных пользователем. CreateCustomAttributeUI теперь добавляет элемент управления DropDownList для атрибутов типа Pick List. Он заполняет DropDownList набором опций, указанных для специализированного атрибута. Он также включает вариант "-- Select One --". Если специализированный атрибут отмечен как обязательный, то добавляется RequiredFieldValidator , при этом его свойство InitialValue установлено в опцию "-- Select One --".
Метод GetValueForCustomAttribute получает DropDownList (посредством метода FindControl). Если выбрана опция "-- Select One --", то тогда используется значение NULL базы данных для DynamicValue в таблице DynamicValuesForClients. В противном случае используется соответствующее значение DynamicPickListOptionID опции.
![](/images/stories/dotnet/aspnet-datadriven-ui/13.gif)