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

时间:2009-10-16 19:39:42

标签: c# asp.net render ektron

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

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

更新

以下是我目前用来完成此操作的代码:

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

5 个答案:

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

答案 1 :(得分:5)

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

您可以使用两种方法。

  1. 这与接受的类似 回答。但我会建议 覆盖a中的render方法 BasePage并获得你所有的 这个模板。

  2. 使用HttpModule或Global.asax和 将Filter附加到响应中 宾语。对我而言,这样做更多 审美感因为“过滤器” 财产应该帮助你 过滤精确的输出 你想要什么!

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

答案 2 :(得分:1)

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

  

在此事件发生之前:

     

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

     

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

     

•发生PreRender事件   对于页面上的每个控件。 使用   事件对...进行最后的更改   页面内容或其控件

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

  

在此事件发生之前,已为页面保存ViewState   并适用于所有控制。 对...的任何更改   此时的页面或控件   将被忽略。使用此事件   执行需要视图状态的任务   得救,但不做任何事   改变控制。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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