Создание динамического пользовательского интерфейса ASP.NET, управляемого данными - Приступаем к работе
ОГЛАВЛЕНИЕ
Приступаем к работе
По завершении первой части наше веб-приложение состояло только из базы данных в каталоге App_Data, которая реализовала модель данных нашего приложения и схему, необходимую для SqlMembershipProvider. В примере, доступном в конце статьи, вы увидите, что я добавил несколько аспектов пользовательского интерфейса, такие как:
- Мастер-страница, которая реализует дизайн веб-сайта, основанный на CSS.
- Файл карты сайта (Web.sitemap) с ссылками на различные секции сайта.
- Страница авторизации, где пользователи могут авторизироваться и перейти к своей учетной записи.
- Каталог Customers, который был сконфигурирован таким образом, что пользователи, обладающие специальными правами, могут посетить ASP.NET-страницы. В данном каталоге вы найдете страницу DefineClientAttributes.aspx, где пользователь может создать и управлять специализированными клиентскими атрибутами..
Определение связи между авторизированным на данный момент клиентом и пользователем
При посещении страницы DefineClientAttributes.aspx нам необходимо отобразить список клиентских атрибутов. Поскольку данные атрибуты специфичны для каждого клиента, то нам надо определить, к какому пользователю привязан на данный момент авторизированный клиент. Эта информация хранится в таблице ExtendedUserInfo, созданной в первой части данной серии статейй.
Существует несколько случаев, когда нам необходимо определить значение CustomerId, связанное с клиентом, авторизировавшим себя. К примеру, нам необходимо определить значение CustomerId в DefineClientAttributes.aspx при перечислении клиентских атрибутов и при добавлении новых атрибутов к базе данных. Аналогично нам необходимо значение CustomerId при генерации динамического пользовательского интерфейса, управляемого данными, поскольку необходимо знать, какие атрибуты отображать в интерфейсе. Поэтому давайте создадим вспомогательный метод, который возвращает значение CustomerId авторизированного на данный момент пользователя.
Я создал такой метод в классе, названном Helpers и находящемся в каталоге App_Code. Данный класс обладает единственной общедоступной функцией - GetCustomerIdForLoggedOnUser, которая может обратиться к базе данных, осуществить запрос к таблице ExtendedUserInfo и возвратить значение CustomerId, ассоциированное с пользователем, авторизировавшим себя. Вот полный код класса:
Imports System.Data.SqlClient
Public Class Helpers
'Возврат значения CustomerId, ассоциированного с пользователем, авторизировавшим себя
Public Shared Function GetCustomerIdForLoggedOnUser() As Guid
Dim UserIdValue As Guid = Guid.Empty
If Membership.GetUser() IsNot Nothing Then
UserIdValue = Membership.GetUser().ProviderUserKey
End If
Using myConnection As New SqlConnection
myConnection.ConnectionString = ConfigurationManager.ConnectionStrings("LawFirmConnectionString").ConnectionString
Dim myCommand As New SqlCommand
myCommand.Connection = myConnection
myCommand.CommandText = "SELECT CustomerId FROM ExtendedUserInfo WHERE UserId = @UserId"
myCommand.Parameters.AddWithValue("@UserId", UserIdValue)
myConnection.Open()
Dim customerId As Guid = CType(myCommand.ExecuteScalar(), Guid)
myConnection.Close()
Return customerId
End Using
End Function
End Class
Значение UserIdавторизированного на данный момент пользователя можно получить при помощи Membership.GetUser().ProviderUserKey. Метод Membership.GetUser() возвращает информацию о клиенте. Свойства ProviderUserKey получает значение UserId. Данное значение используется для параметра @UserId в упомянутом выше выражении SELECT.