我有一个页面上有一堆用户控件。我希望能够在我的代码中替换的内容中直接使用“宏”或“占位符”。它应该不重要,但我使用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);
}
答案 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)
我知道这个答案没有帮助,因为你已经解决了这个问题并继续前进。这适用于将来会遇到类似问题的人;)
您可以使用两种方法。
答案 2 :(得分:1)
您是否看过生命周期中的PreRender事件?
在此事件发生之前:
•Page对象调用EnsureChildControls 每个控件和页面。
•每个 数据绑定控件的DataSourceID 属性设置调用其DataBind 方法。
•发生PreRender事件 对于页面上的每个控件。 使用 事件对...进行最后的更改 页面内容或其控件。
我相信这是你可以做这样的事情的最后一个地方。下一个事件是 SaveStateComplete ,根据文档中有此行为:
在此事件发生之前,已为页面保存ViewState 并适用于所有控制。 对...的任何更改 此时的页面或控件 将被忽略。使用此事件 执行需要视图状态的任务 得救,但不做任何事 改变控制。
答案 3 :(得分:0)
想到的简单回答是为您的“占位符”使用asp:Literal控件。您可以在页面加载期间设置其内容,也可以挂钩到PreRender事件并设置它们。
答案 4 :(得分:0)
听起来您可能希望在页面中包含HTML文字,然后您可以使用Page_Load事件中的相应内容替换它们。
这将要求您编写HTML代码,而不是一些简单的文本,但听起来您可能会在其中注入自己的JavaScript代码等,这将非常适合。