如何自定义WebViewPage执行输出?

问题描述:

我将在我们的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标记?

终于让我找到了一招通过这种方式来做到这一点:

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()); 
    } 

这种方法适用于我。所以我贴了它,也许帮助一些;)

您应该使用MVC的布局系统......它的功能齐全的有一个总的布局模式:=)