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

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

ОГЛАВЛЕНИЕ

Добавление новых динамических клиентских атрибутов

В дополнение к просмотру динамических атрибутов клиентов посетителям страницы также надо предоставить возможность добавлять новые атрибуты, а это можно выполнить несколькими способами. Одним из легких путей ввода информации в базу данных из веб-страницы является использование элемента управления DetailsView вместе с элементом управления источником данных, который настроен таким образом, что он поддерживает вставку данных. Элемент управления источником данными CustomAttributesDataSource включает в себя свойство InsertCommand, которое указывает выражение INSERT, используемое для добавления новых записей к таблице DynamicAttributesForClients:

INSERT INTO [DynamicAttributesForClients] ([CustomerId], [DataTypeId], [AttributeName], [SortOrder])
VALUES (@CustomerId, @DataTypeId, @AttributeName, @SortOrder) 

Используя данное выражение мы можем настроить DetailsView таким образом, чтобы он поддерживал вставку данных, и более того, DetailsView может быть перманентно настроен на обработку в режиме вставки путем установки его свойства DefaultMode в Insert.

Значения DataTypeId, AttributeName и SortOrder нового атрибута должны быть указаны посетителем. Значение CustomerId, основано на пользователе, который в данный момент авторизирован, и оно может быть заполнено программно посредством метода GetCustomerIdForLoggedOnUser в классе Helpers. Чтобы установить значение CustomerId создайте обработчик для события ItemInserting элемента DetailsView. Данное событие запускается при старте процесса вставки и предоставляет возможность специализации значений, которые будут использованы при добавлении новой записи. Просто установите значение CustomerId в значение, возвращенное методом GetCustomerIdForLoggedOnUser:

Protected Sub dvAddAttribute_ItemInserting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewInsertEventArgs) Handles dvAddAttribute.ItemInserting
   e.Values("CustomerId") = Helpers.GetCustomerIdForLoggedOnUser()
End Sub 

По умолчанию интерфейс вставки DetailsView составлен из элемента управления TextBox. В то время как TextBox пригоден в некоторых случаях, он не настолько идеален в случаях ввода информации, когда требуется наличие какой-либо валидации, что лучше выполнить посредством альтернативного элемента управления ввода данных. К примеру, поле DataTypeId является внешним ключом к таблице DynamicAttributeDataTypes. Интерфейс вставки должен позволить посетителю выбирать тип данных нового атрибута из выпадающего списка вместо того, чтобы запрашивать у него значение ID. Аналогично интерфейс вставки для AttributeName и SortOrder должен включать в себя логику валидации, поскольку оба поля являются обязательными.

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


Для того, чтобы получить больше информации по теме вставки данных при помощи элементов управления источника данных ASP.NET читайте статьи о вставке данных .

Не забудьте убрать атрибут Type для декларативных параметров с типом uniqueidentifier
Мастер Configure Data Source (настройка источника данных) элемента SqlDataSource позволяет с легкостью генерировать выражения INSERT, UPDATE и DELETE для запроса к базе данных. Тем не менее, есть одна проблема, которую вы должны учесть - параметры, созданные мастером для колонок с типом uniqueidentifier имеют своё свойство Type , установленное в Object. В таком случае при попытке вставки, редактирования и удаления информации будет вызвана исключительная ситуация, сопровождаемая сообщением: "Implicit conversion from data type sql_variant to uniqueidentifier is not allowed. Use the CONVERT function to run this query." (Неявное преобразование типа данных sql_variant в uniqueidentifier запрещено. Используйте функцию CONVERT для запуска данного запроса. )

Чтобы исправить данную ситуацию просто уберите атрибут Type из декларативной разметки параметра. Другими словами, вручную измените синтаксис параметра с:

<asp:SqlDataSource ...>
   <InsertParameters>
      <asp:Parameter Name="CustomerId" Type="Object" />
      ...
   </InsertParameters>
</asp:SqlDataSource>

На:

<asp:SqlDataSource ...>
   <InsertParameters>
      <asp:Parameter Name="CustomerId" />
      ...
   </InsertParameters>
</asp:SqlDataSource>