Подключите повторно используемый ASP.NET WebControl к методу загрузки данных.

Я пытаюсь создать элемент управления, который может расширять другие веб-элементы управления и устанавливать некоторые свойства, такие как видимые и включенные, на основе разрешений пользователей.

Вот пример, где ваша роль пользователя должна включать разрешение "CanSave":

<asp:Button ID="btn1" runat="server" Text="Save"/>
<myControls:PermissionsExtender runat="server" ControlToSet="btn1" Permission="CanSave"/>

Я пытаюсь сохранить это повторное использование, поэтому PermissionExtender находится в отдельном проекте, который не может иметь никаких зависимостей от других проектов. Чтобы принять решение, контроль, конечно, должен получить эту информацию откуда-то еще (база данных или что-то). Я сделал еще один элемент управления, и, используя события, вышеуказанный экстендер будет установлен главным элементом управления, поэтому только тот, кто должен знать, где искать информацию.

Теперь необходимо настроить главный элемент управления, чтобы знать, откуда будет поступать информация о ролях и разрешениях. Моя идея заключалась в том, чтобы иметь интерфейс внутри проекта многократного использования и реализовывать его где-то еще, а затем сконфигурировать мой элемент управления, чтобы перейти к поиску класса, реализующего нужный мне метод, и загрузить его через отражение. Но мне неясно, как это может работать. Я бы, вероятно, разместил главный элемент управления на главной странице и предоставил ему имя класса, например PermissionClass="SecurityLibrary.PermissionsClass". Вроде как ObjectDatasource делает это, но приветствуются и другие предложения.

Подпись метода будет выглядеть так: bool HasPermission(string permission)Он знал бы текущую роль пользователя и, используя эту комбинацию, ищет, включает ли роль разрешение.

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

1 ответ

Решение

Я думаю, что у меня есть кое-что, что будет работать для вас (хорошо для меня проверено, но я, возможно, неправильно понял часть того, что вы искали). С этой реализацией код конструктора asp.net будет выглядеть так:

    <web:PermissionMasterControl runat="server" ID="masterController" PermissionClass="SecurityLibrary.RandomPermissionClass" />

    <asp:Button ID="btnSave" runat="server" Text="save" />
    <web:PermissionExtender runat="server" ControlToSet="btnSave" Permission="CanSave" MasterControllerID="masterController" />

Теперь для SecurityLibrary. Довольно просто, я включил простой "RandomPermissionClass", который случайным образом возвращает истину / ложь.

Namespace SecurityLibrary
    Public MustInherit Class PermissionClass
        Public MustOverride Function HasPermission(ByVal permission As String) As Boolean
    End Class

    Public Class RandomPermissionClass
        Inherits PermissionClass

        Private rand As New Random()

        Public Overrides Function HasPermission(permission As String) As Boolean
            Return If(rand.Next(2) = 0, False, True)
        End Function
    End Class
End Namespace

Теперь у нас есть библиотека "myControls", которая не содержит ссылок на SecurityLibrary. Я создал два элемента управления и делегат. Элементы управления являются "PermissionMasterControl" и "PermissionExtender". Делегат - это то, что фактически используется для проверки отраженного объекта.

Namespace myControls
    Public Delegate Function HasPermissionDelegate(ByVal permission As String) As Boolean

    Public Class PermissionMasterControl
        Inherits System.Web.UI.Control

        Public Property PermissionClass As String
            Get
                Return If(ViewState("PermissionClass") Is Nothing, "", ViewState("PermissionClass").ToString())
            End Get
            Set(value As String)
                ViewState("PermissionClass") = value
            End Set
        End Property

        Private ReadOnly Property PermissionDelegate As HasPermissionDelegate
            Get
                If _permissionDel Is Nothing Then
                    If Not String.IsNullOrEmpty(PermissionClass) Then
                        Dim t = Type.GetType(PermissionClass, False)

                        If t IsNot Nothing Then
                            _permissionObj = Activator.CreateInstance(t)

                            Dim mi As MethodInfo = _
                                    t.GetMethod("HasPermission", BindingFlags.Public Or BindingFlags.Instance)

                            _permissionDel = [Delegate].CreateDelegate(GetType(HasPermissionDelegate), _permissionObj, mi)

                        End If
                    End If
                End If

                Return _permissionDel
            End Get
        End Property

        Private _permissionObj As Object = Nothing
        Private _permissionDel As HasPermissionDelegate = Nothing

        Public Function HasPermission(ByVal permission As String) As Boolean
            If PermissionDelegate Is Nothing Then
                Throw New NullReferenceException("The specified permission class (" + PermissionClass + ") could not be loaded/found.")
            End If

            Return PermissionDelegate(permission)
        End Function
    End Class

    Public Class PermissionExtender
        Inherits System.Web.UI.Control

        Public Property ControlToSet As String
            Get
                Return If(ViewState("ControlToSet") Is Nothing, "", ViewState("ControlToSet").ToString())
            End Get
            Set(value As String)
                ViewState("ControlToSet") = value
            End Set
        End Property

        Public Property Permission As String
            Get
                Return If(ViewState("Permission") Is Nothing, "", ViewState("Permission").ToString())
            End Get
            Set(value As String)
                ViewState("Permission") = value
            End Set
        End Property

        Public Property MasterControllerID As String
            Get
                Return If(ViewState("MasterControllerID") Is Nothing, "", ViewState("MasterControllerID").ToString())
            End Get
            Set(value As String)
                ViewState("MasterControllerID") = value
            End Set
        End Property

        Protected ReadOnly Property MasterController As PermissionMasterControl
            Get
                If _mastercontroller Is Nothing Then
                    _mastercontroller = Me.Page.FindControl(MasterControllerID)
                End If

                Return _mastercontroller
            End Get
        End Property

        Protected ReadOnly Property ManagedControl As Control
            Get
                If _controlToSet Is Nothing Then
                    _controlToSet = Me.NamingContainer.FindControl(ControlToSet)
                End If

                Return _controlToSet
            End Get
        End Property

        Private _controlToSet As Control = Nothing
        Private _mastercontroller As PermissionMasterControl = Nothing


        Protected Overrides Sub OnLoad(e As System.EventArgs)
            MyBase.OnLoad(e)

            Dim bResult As Boolean = MasterController.HasPermission(Permission)

            ManagedControl.Visible = bResult
        End Sub
    End Class
End Namespace
Другие вопросы по тегам