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

Joh*_*ski 10 c# asp.net render ektron

我有一个页面上有一堆用户控件.我希望能够在我的代码中替换的内容中直接使用"宏"或"占位符".这应该不重要,但我使用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);
}
Run Code Online (Sandbox Code Playgroud)

Jus*_*ren 8

你试过覆盖渲染方法吗?

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()););
}
Run Code Online (Sandbox Code Playgroud)

  • 什么是tmpWriter? (3认同)

mad*_*ode 5

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

您可以使用两种方法.

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

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

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