如何自定义 WebViewPage 执行输出?

How to customize WebViewPage executation output?

我将在 Asp.Net MVC 应用程序的每个视图中注入一些元素。所以这样做(我发现了这个: 答案)我已经将 WebViewPage 子类化并且我已经覆盖了 ExecutePageHierarchy 如下所示:

   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 标记可能还有其他一些视图或布局?

你应该使用 MVC 的布局系统......拥有一个主布局模式是全功能的:=)

最后我找到了一个技巧来做到这一点:

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

这种方法对我很有效。所以我发布了它,也许对某些人有帮助;)