Получение ссылки на серверные элементы управления, когда обработчиком является MvcHandler
Я работаю над модулем http, чтобы скрыть определенный контент на моем веб-сайте, если определенные критерии не выполнены. Моя установка обработчика довольно проста. Вот соответствующие части моего вопроса:
Public Interface IFeatureItem
Property ID As Guid
Sub FeatureItemPreRenderComplete(ByVal sender As Object, ByVal e As EventArgs)
End Interface
Public Class MyModule
Implements System.Web.IHttpModule
Public Sub Init(ByVal context As System.Web.HttpApplication) Implements System.Web.IHttpModule.Init
AddHandler context.PreRequestHandlerExecute, AddressOf Application_PreRequestHandlerExecute
End Sub
Private Sub Application_PreRequestHandlerExecute(ByVal source As Object, ByVal e As EventArgs)
If TypeOf source Is HttpApplication Then
Dim Application As HttpApplication = source
If TypeOf Application.Context.Handler Is Page Then
Dim Page As Page = Application.Context.Handler
AddHandler Page.PreRenderComplete, AddressOf FeatureItemPreRenderComplete
ElseIf TypeOf Application.Context.Handler Is System.Web.Mvc.MvcHandler Then
Dim MvcHandler As System.Web.Mvc.MvcHandler = Application.Context.Handler
<What do I do here>
End If
End If
End Sub
Private Sub FeatureItemPreRenderComplete(ByVal source As Object, ByVal e As System.EventArgs)
Dim Page As Page = source
Dim Repository As IFeatureRepository = GetRepository(Page.Application) 'Holds supported IFeature
Dim IFeatureItems As IEnumerable(Of IFeatureItem) = GetIFeatureItems(Page) 'Goes through Page's control tree and returns IFeatureItems
For Each IFeatureItem In IFeatureItems
Dim FeatureEventArgs As FeatureEventArgs = New FeatureEventArgs(IFeatureItem.ID, FeatureAllowed(IFeatureItem.ID, Repository))
IFeatureItem.FeatureItemPreRenderComplete(Me, FeatureEventArgs)
Next
End Sub
<Irrelevant stuff removed>
End Class
В основном настройка обработчиков событий на объекте страницы, если обработчик является страницей. Затем в PreRenderEvent я перебираю все IFeatureItems на странице и вызываю метод в IFeatureItem. Это прекрасно работает, если обработчик страницы.
Этот сайт имеет представление mvc для панели мониторинга, а также содержит элементы управления веб-формами, которые могут быть IFeatureItem. То, что я хочу сделать, это перебрать элементы управления веб-формами в этом представлении и выполнить ту же обработку на них, что и на обычной странице, но я не могу придумать, как это сделать, и мне не повезло. Возможно ли это в модуле? Является ли PreRequestHandlerExecute правильным событием для настройки моих обработчиков событий?
1 ответ
Вы пытаетесь сделать это с неправильной точки расширяемости.
В MVC ViewPage
, который наследует от Page
отображается в виртуальном WebFormView
метод: Render(ViewContext viewContext, TextWriter writer)
,
Ваше решение состоит в том, чтобы переопределить этот метод и выполнить ваши события перед рендерингом здесь.
Чтобы лучше понять, как сделать это эффективно, я бы предложил рассмотреть источник WebFormView
, ViewPage
, а также ViewUserControl
с.NET Reflector. По сути, WebFormView использует BuildManager для создания ViewUserControl или ViewPage на основе ViewPath. Оба эти класса происходят от Control
так что это должно быть прямо для вас оттуда.