Создание специализированных элементов управления параметрами (Parameter Controls) в ASP.NET 2.0 - Определение UserId авторизированного пользователя

ОГЛАВЛЕНИЕ


Определение UserId авторизированного пользователя

Если вы используете Membership в ASP.NET 2.0 для управления информацией пользовательских записей, и если в вашей модели существует информация конкретного пользователя, то на каком-то этапе вам наверняка  захочется  добавить новую запись и использовать значение UserId авторизированного на данный момент пользователя,  или же отобразить информацию конкретного пользователя и получить данные авторизированного пользователя. Используя подсистему Membership, вы можете осуществить доступ к информации авторизированного пользователя при помощи Membership.GetUser(), и значение UserId будет возвращено в свойстве UserProviderKey класса MembershipUser. К сожалению, не существует встроенного элемента управления Parameter , который возвращал бы значение UserId на данный момент авторизированного пользователя. Это означает, что вам надо либо программно предоставить данное значение, либо... создать специализированный элемент управления Parameter! (Если вы не знакомы с подсистемой Membership в ASP.NET 2.0, то прочитайте серию статей "Исследуем Membership, роли и профили в ASP.NET 2.0" .)

Для облегчения задачи я создал элемент управления MembershipUserIdParameter , который возвращает UserId текущего пользователя. Код достаточно простой, и полностью зависит от интерфейса Membership API. Вот как выглядит метод Evaluate():

Protected Overrides Function Evaluate(ByVal context As System.Web.HttpContext, ByVal control As System.Web.UI.Control) As Object
    Dim currentUser As MembershipUser = Membership.GetUser()
    If currentUser Is Nothing Then
       'Either Membership is not setup or the visitor to this page is anonymous
       Return Nothing
    Else
       'Return the currently logged on user's UserId
       Return currentUser.ProviderUserKey
    End If
End Function

Вот и все! В приложении к данной статье вы найдете пример MembershipUserIdParameter.aspx, который имеет таблицу PersonalNotes в базе данных. Данная таблица базы данных разработана для того, чтобы пользователи могли  добавлять заметки. Каждая запись имеет UserId, что служит в качестве внешнего ключа обратно к колонке UserId в таблице aspnet_Users (одна из таблиц в схеме используемой провайдером SqlMembershipProvider).

Как демонстрирует следующая разметка, элемент управления MembershipUserIdParameter используется в наборе SelectParameters для возврата заметок авторизированного пользователя, а также в наборе InsertParameters для того, чтобы автоматически добавлять UserId авторизированного пользователя к выражению INSERT при добавлении новой заметки посредством DetailsView. Таблица PersonalNotes также имеет поле NoteDate для даты/времени; элемент управления TodayParameter используется для того, чтобы предоставить это значение в наборе InsertParameters.

<asp:SqlDataSource ID="PersonalNotesDataSource" runat="server"         ConnectionString="<%$ ConnectionStrings:ConnectionString         %>"    
    InsertCommand="INSERT INTO [PersonalNotes] ([UserId], [NoteDate], [Subject], [Body]) VALUES (@UserId, @NoteDate, @Subject, @Body)"
    SelectCommand="SELECT [PersonalNoteID], [UserId], [NoteDate], [Subject], [Body] FROM [PersonalNotes] WHERE UserId = @UserId ORDER BY NoteDate DESC"
>
    <InsertParameters>
       <skm:MembershipUserIdParameter Name="UserId" />
       <skm:TodayParameter Name="NoteDate" />

       <asp:Parameter Name="Subject" Type="String" />
       <asp:Parameter Name="Body" Type="String" />
    </InsertParameters>
    <SelectParameters>
       <skm:MembershipUserIdParameter Name="UserId" />
    </SelectParameters>
</asp:SqlDataSource>