Получение ссылки на серверные элементы управления, когда обработчиком является 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так что это должно быть прямо для вас оттуда.

Другие вопросы по тегам