2009-10-16 96 views
10

我有一个页面上有一堆用户控件。我希望能够直接在我的代码中替换的内容中包含“宏”或“占位符”。这应该不重要,但我使用Ektron作为我的CMS。如何在输出之前修改整个ASP.NET页面内容?

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

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

回答

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());); 
} 
+0

是的,这是正确的地方,但有可能(和明智的)做重置和读取流? – 2009-10-16 19:51:21

+1

你从来没有“重置”流,因为它还没有发送。我不确定是否明智,不,我只是回答了这个问题lol – JustLoren 2009-10-16 19:53:59

+0

我现在正在使用这种方法,但会等待接受答案,看看是否有更好的解决方案。基本上我... 让页面写入临时缓冲区。 修改缓冲区。 用修改的替换原始缓冲区。 – 2009-10-16 20:22:00

1

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

该事件发生前:

•Page对象要求 每个控件和页面EnsureChildControls。

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

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

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

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

0

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

+0

中的拼写错误。不幸的是,我不能这样做,因为这些“占位符”将在用户控件内部呈现的内容中,我无法触及。所以当它到达我的时候,我唯一能做的就是看看渲染的内容。 – 2009-10-16 20:17:16

+0

对不起,我错过了“用户控制”,我的不好。 用户控件也具有PreRender事件。您应该能够将公共属性放置在页面可以设置的用户控件上,然后让用户控件执行替换。 – 2009-10-16 20:38:41

0

这听起来像你可能想在你的页面中有HTML文字,然后你可以简单地用Page_Load事件中的相应内容替换它们。

这将需要你写出HTML代码,而不是一些简单的文本,但它听起来像你可能注入自己的JavaScript代码或类似的东西,这将很适合。

5

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

有两种方法可以使用。

  1. 这与接受的 的答案类似。但我会推荐 覆盖 BasePage中的渲染方法,并从中导出所有的 模板。

  2. 使用HttpModule或Global.asax和 将Filter附加到响应 对象。对我来说,这使得更多的 美学意义,因为“过滤器” 属性应该帮助你 筛选输出,这正是 你想要的!

顺便说一句,Ektron到目前为止如何?他们确实让我疯狂!

+0

感谢您的回答。投票努力! BasePage事情并不是一个真正不同的解决方案,但更多的是接受的解决方案。但好主意。我认为创建一个所有页面派生自的BasePage类总是一个好主意。或者,也许2-3取决于你所拥有的页面类型。 至于HttpModule和过滤器,那真是太棒了!再次,类似于接受的解决方案,但替换的逻辑将从页面中提取出来。如果您在多个地方进行替换,这将非常棒!太好了! – 2009-11-09 19:24:03

+0

哦,是的...... Ektron ......我个人不喜欢它。整个产品是屁股后退。他们的API很丑陋,而且非常复杂。整个产品是越野车,但代码混淆,所以你没有希望弄清楚他们正在试图做什么。他们的支持论坛不太好。 如果您正在寻找新的CMS,我会推荐Kentico。大多数情况下,您不必编写任何代码。但是当你编写代码时,他们的API非常棒!我对Kentico唯一的抱怨就是他们的缓存系统很混乱,默认情况下不是以智能的方式进行安装。 – 2009-11-09 19:34:17

相关问题