我将在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标记布局?
答案 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的布局系统......它的全功能有一个主布局架构:=)