Подключите повторно используемый 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