2012-02-15 19 views
8

ASP.NET MVCがRazorを含むページを実行すると、最初に本体が実行されます(例:RenderBody)。次に、レイアウト用のコードが実行され、一緒に織り込まれます。レイアウト実行とポストボディレンダリングの前にASP.NET MVCにフックがありますか?

これは、このblog postで文書化されています

System.Web.Mvc.RazorView.RenderView() System.Web.WebPages.WebPageBase.ExecutePageHierarchy()//非仮想 バージョンのSystem.Webを。 WebPages.WebPageBase.PushContext()
System.Web.WebPages.WebPageBase.ExecutePageHierarchy()//私たちのビューから仮想 バージョンthis.Execute()//生成されたコード
System.Web.WebPages.WebPageBase.PopContext
RenderSurrounding(virtualPath、body); //レンダリングのレイアウトは、 で、Viewのレンダリングプロセスに似ています。基本的には入れ子にすることができます。 Layout VerifyRenderdBodyOrSetions();

私は自分の意見やページ内の実際論理位置をトレースしたレイアウトにコードを追加します。

私はちょうどRenderBody仕上げが実行直後 RenderSurroundingとを実行するためのメソッドをフックすることができます方法はありますか?

+0

'RenderBody'はレイアウトによって呼び出されます(少なくとも私が取り組んだカップルのMVCプロジェクトでは)。あなたはおそらく 'RenderSurrounding'をヘルパー(既に存在しない場合)にラップし、レイアウトの' RenderBody'の呼び出しの前後に追加することができます。 –

+0

@ M.Babcock理想的には、レイアウト変更を伴わないフレームワークのフックを探しています –

+0

しかし、あなたの質問には次のように書かれています:*ページ内の実際の論理位置をトレースするビューとレイアウトにコードを追加したい*とにかくレイアウトを変更しようとしているのですか? –

答えて

5

あなたはこのようWebViewPage実装与え、あなたのページの異なる基本型を作成することにより、ページ自体のExecutePageHierarchyメソッドをオーバーライドすることができます。

public abstract class CustomViewPage<TModel> : WebViewPage<TModel> 
{ 
    public override void ExecutePageHierarchy() 
    { 
     Output.Write("Before"); 
     base.ExecutePageHierarchy(); 
     Output.Write("After"); 
    } 
} 

あなただけの実際のページのコンテンツの前と後の出力を取得します(したがってレイアウト内に)配置されます。あなたが探しているものがあれば私は分かりません。あなたはスクリプトを書くつもりですか?</body>私は想像していますか?

主なものは、それが本当によく、すぐ内側(レイアウトのRenderBody出力周りの人Output.Write Sをレンダリングするだけで、メイン.cshtml(ないレイアウト上の任意のパーシャルや)の基底型のこの種を使用することです)。

ディレクトリごとにベースタイプをweb.configに設定できます。

関連する問題