2011-02-04 7 views
0

特定の条件が満たされていない場合は、httpmoduleを使用してWebサイトの特定のコンテンツを非表示にしています。私のハンドラの設定はかなり簡単です。私の質問に関連する部分は次のとおりです。ハンドラがMvcHandlerのときにサーバーコントロールへの参照を取得する

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 Iで、ページのすべてのIFeatureItemをループし、IFeatureItemのメソッドを呼び出します。ハンドラがページである場合、これはうまく動作します。

このサイトには、ダッシュボード用のmvcビューがあり、IFeatureItemでもよいWebフォームコントロールが含まれています。私がしたいことは、このビューのwebformsコントロールをループして、通常のページと同じ処理を行いますが、そうする方法は見つけられず、グーグルグーグルではありません。これはモジュール内で可能ですか? PreRequestHandlerExecuteはイベントハンドラを設定する正しいイベントですか?

答えて

1

間違った拡張ポイントからこれを実行しようとしています。

Pageを継承するViewPageは、仮想WebFormViewメソッドでレンダリングされます。Render(ViewContext viewContext, TextWriter writer)

あなたの解決策は、このメソッドをオーバーライドしてレンダリングイベントをここで実行することです。

これを効果的に行う方法をよりよく理解するには、.NET ReflectorでWebFormViewViewPage、およびViewUserControlのソースを確認することをおすすめします。基本的に、WebFormViewはBuildManagerを使用して、ViewPathに基づいてViewUserControlまたはViewPageを作成します。これらのクラスはどちらもControlから派生していますので、そこからあなたのためにまっすぐ進むはずです。

+0

あなたが言及したクラスのソース(およびMVCフレームワークの任意の部分)を見たい場合、彼はソースをダウンロードするだけです:http://aspnet.codeplex.com/releases/view/58781 –

+0

私は望んでいました私のHttpModuleに実際には適合しないので、これを行う必要はありません。私は、OnPreRenderのサブを上書きするために、新しいpageBaseTypeとuserControlBaseTypeを作成できると思います。私は最小限の変更を加えるためにHttpModuleからこれを行うことができることを望んでいました。 HttpModuleのアプローチでは、特定のインタフェースを実装するオブジェクトにのみ影響します。このアプローチは、私のすべてのページとコントロールのbasetypeを変更するか、または私はいくつかの巧妙な切り替えを行う必要があります。 –

+0

私の質問は、実際には、これらのViewPageおよびViewUserControlへの参照をMvcHandlerオブジェクトから取得するために実際にそこにあります。 –

関連する問題