如何在输出之前修改整个ASP.NET页面内容?

我有一个页面上有一堆用户控件。 我希望能够在我的代码中替换的内容中直接使用“宏”或“占位符”。 这应该不重要,但我使用Ektron作为我的CMS。

是否有任何页面事件可以挂钩到整个呈现的页面内容上进行字符串替换,就在它被发送到客户端之前?

UPDATE

这是我目前用来完成此任务的代码:

protected override void Render(HtmlTextWriter writer) { string content = string.Empty; using (var stringWriter = new StringWriter()) using (var htmlWriter = new HtmlTextWriter(stringWriter)) { // render the current page content to our temp writer base.Render(htmlWriter); htmlWriter.Close(); // get the content content = stringWriter.ToString(); } // replace our placeholders string newContent = content.Replace("$placeholder1$", "placeholder1 data").Replace("$placeholder2$", "placeholder2 data"); // write the new html to the page writer.Write(newContent); } 

你试过覆盖渲染方法吗?

 protected override void Render(HtmlTextWriter writer) { StringBuilder htmlString = new StringBuilder(); // this will hold the string StringWriter stringWriter = new StringWriter(htmlString); HtmlTextWriter tmpWriter = new HtmlTextWriter(stringWriter); Page.Render(tmpWriter); writer.Flush(); writer.Write(DoReplaceLogic(htmlString.ToString());); } 

我知道这个答案没有帮助,因为你已经解决了这个问题并继续前进。 这适用于未来将面临类似问题的人;)

您可以使用两种方法。

  1. 这与接受的答案类似。 但我建议覆盖BasePage中的render方法并从中派生所有模板。

  2. 使用HttpModule或Global.asax并将Filter附加到Response对象。 对我来说,这更具美感,因为“过滤”属性应该可以帮助您过滤输出,这正是您想要的!

顺便说一下,到目前为止Ektron的情况如何? 他们肯定会让我发疯!

您是否看过生命周期中的PreRender事件?

在此事件发生之前:

•Page对象为每个控件和页面调用EnsureChildControls。

•设置了DataSourceID属性的每个数据绑定控件都调用其DataBind方法。

•页面上的每个控件都会发生PreRender事件。 使用该事件对页面内容或其控件进行最终更改

我相信这是你可以做到这一点的最后一个地方。 下一个事件是SaveStateComplete ,根据文档有这种行为:

在此事件发生之前,已为页面和所有控件保存ViewState。 此时对页面或控件的任何更改都将被忽略。 使用此事件执行需要保存视图状态但不对控件进行任何更改的任务。

想到的简单回答是为您的“占位符”使用asp:Literal控件。 您可以在页面加载期间设置其内容,也可以挂钩PreRender事件并进行设置。

听起来您可能希望在页面中包含HTML文字,然后您可以使用Page_Load事件上的相应内容替换它们。

这将要求您编写HTML代码,而不是一些简单的文本,但听起来您可能会在那里注入自己的JavaScript代码等,这将非常有用。