2015-04-05 86 views
0

我將在我們的Asp.Net MVC應用程序的每個視圖中注入一些元素。所以要做到這一點(我發現這一點:Custom WebViewPage inject code when razor template is rendering答案)我有子類的WebViewPage,我已經覆蓋了ExecutePageHierarchy象下面這樣:如何自定義WebViewPage執行輸出?

public override void ExecutePageHierarchy() 
    { 
     base.ExecutePageHierarchy(); 
     string output = Output.ToString(); 
     if (MyHelper.InitializationRequired) 
      output = MyHelper.GetPageHeader() + output + MyHelper.GetPageFooter(); 
     //-------------- 
     Response.Clear(); 
     Response.Write(output); 
     Response.End(); 
    } 

這段代碼,我們可以包裝所有的輸出標記與一些頭和一些頁腳元素,如腳本或其他標籤,我想這樣做。

但是這樣我們完全失去了Layout由於清除響應。

我的主要問題是,如何準確之前或之後究竟WebViewPage的輸出通過保留這可能還有一些其他觀點或佈局響應的內容注入一些HTML標記?

回答

1

終於讓我找到了一招通過這種方式來做到這一點:

public override void ExecutePageHierarchy() 
    { 
     var tmp = OutputStack.Pop(); 
     var myWriter = new StringWriter(); 
     OutputStack.Push(myWriter); 
     base.ExecutePageHierarchy(); 

     tmp.Write(
      string.Format("<div> Header of [{0}]</div> {1} <div> Footer of [{0}]</div>", 
      VirtualPath, 
      myWriter.ToString())); 
    } 

它通常運行良好,它通過頁眉和頁腳封裝了視圖的輸出。但在我的情況下,我應該能夠訪問一些將在執行視圖上分配的標誌。所以我必須在查看執行後檢查它們:

public override void ExecutePageHierarchy() 
    { 
     var tmp = OutputStack.Pop(); 
     var myWriter = new StringWriter(); 
     OutputStack.Push(myWriter); 
     base.ExecutePageHierarchy(); 
     if (MyHelper.InitializationRequired) 
      tmp.Write(
      string.Format("<div> Header of [{0}]</div> {1} <div> Footer of [{0}]</div>", 
      VirtualPath, 
      myWriter.ToString())); 
     else 
      tmp.Write(myWriter.ToString()); 
    } 

這種方法適用於我。所以我貼了它,也許幫助一些;)

0

您應該使用MVC的佈局系統......它的功能齊全的有一個總的佈局模式:=)