10

我有一个页面,上面有一堆用户控件。我希望能够直接在将在我的代码中替换的内容中包含“宏”或“占位符”。这并不重要,但我使用 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);
}
4

5 回答 5

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()););
}
于 2009-10-16T19:45:48.977 回答
5

您可以使用两种方法:

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

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

于 2009-11-08T01:21:36.427 回答
2

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

在此事件发生之前:

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

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

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

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

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

引用来源:https ://www.c-sharpcorner.com/UploadFile/8911c4/page-life-cycle-with-examples-in-Asp-Net/

于 2009-10-16T19:46:55.350 回答
0

想到的简单答案是使用 asp:Literal 控件作为“占位符”。您可以在页面加载期间设置它们的内容,或者您​​可以挂钩到 PreRender 事件然后设置它们。

于 2009-10-16T19:47:37.470 回答
0

听起来您可能希望在页面中包含 HTML 文字,然后您可以简单地将它们替换为 Page_Load 事件中的适当内容。

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

于 2009-10-16T19:48:14.167 回答