如何自定义WebViewPage执行输出?

时间:2015-04-05 12:54:04

标签: c# asp.net-mvc razor

我将在Asp.Net MVC应用程序的每个视图中注入一些元素。所以这样做(我发现了这个:Custom WebViewPage inject code when razor template is rendering回答)我已经将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标记布局?

2 个答案:

答案 0 :(得分: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());
    }

这种方法对我很有用。所以我发布它,也许帮助一些;)

答案 1 :(得分:0)

你应该使用MVC的布局系统......它的全功能有一个主布局架构:=)