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

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

Вот пример, в котором ваша роль пользователя должна включать разрешение «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 Ответ

1 голос
/ 22 июня 2011

Я думаю, что у меня есть кое-что, что будет работать для вас (хорошо для меня протестировано, но, возможно, я неправильно понял часть того, что вы искали). С этой реализацией код конструктора 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" />

Теперь для библиотеки безопасности. Довольно просто, я включил простой «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
...