2008-11-10 62 views
7

我需要在将ASP.NET发送到客户端之前捕获它的HTML,以便对其进行最后一分钟的字符串操作,然后将修改后的版本发送给客户端。ASP.NET在将页面的HTML发送到客户端之前修改它的HTML

E.G.

页面加载 每一个控制已经正确地呈现 页面完整的HTML已经准备好被转移回客户端

有没有一种办法,在ASP.NET

+0

老兄,不要低估每个没有完全告诉你你想要在他们的回答中听到什么的人。这不是鼓励更多人来帮助你的好方法。我不认为我曾经见过这么多人在同一个问题上低调。 – 2008-11-10 16:14:28

+0

他可能不是那个做过的人...可能是他,但谁知道? – 2008-11-11 14:54:24

回答

8

您可以覆盖页面的Render方法。然后调用基础实现并提供您的HtmlTextWriter对象。下面是一个例子

protected override void Render(HtmlTextWriter writer) 
{ 
    StringWriter output = new StringWriter(); 
    base.Render(new HtmlTextWriter(output)); 
    //This is the rendered HTML of your page. Feel free to manipulate it. 
    string outputAsString = output.ToString(); 

    writer.Write(outputAsString); 
} 
0

查看ASP.NET页面生命周期中的事件序列。 Here's列出事件的一页。有可能你可以找到一个事件来处理页面生命周期中足够晚的事件来进行更改,但仍然可以获取这些更改。

如果不是,您可以随时编写一个HttpModule,在页面本身完成呈现后处理HTTP响应。

0

显然,如果您能够首先从ASP.Net中榨取所需的标记,效率会更高。

考虑到这一点,你有没有考虑过使用Control Adapters?它们可以让你重新掌握你的每个控件如何渲染,而不是稍后修改字符串。

0

使用answer of Atanas Korchev了一些日子,我发现我得到类似的JavaScript错误:

“从服务器收到的消息无法解析”

将此与ASP.NET Ajax UpdatePanel control结合使用时。 The reason is described in this blog post

基本上UpdatePanel似乎是关键的确切呈现字符串的长度是恒定的。即如果更改字符串并且保持的长度,则成功,如果更改文本以使字符串长度发生更改,则会发生上述JavaScript错误。

我不是完美的,但是,有效的解决方案来承担UpdatePanel总是做一个POST和筛选掉:

protected override void Render(HtmlTextWriter writer) 
{ 
    if (IsPostBack || IsCallback) 
    { 
     base.Render(writer); 
    } 
    else 
    { 
     using (var output = new StringWriter()) 
     { 
      base.Render(new HtmlTextWriter(output)); 

      var outputAsString = output.ToString(); 
      outputAsString = doSomeManipulation(outputAsString); 

      writer.Write(outputAsString); 
     } 
    } 
} 

这工作在我的情况,但也有一些缺点,可能不适合您的方案工作:

  • 在回发时,没有字符串被改变。
  • 因此,用户看到的字符串是非操作的字符串
  • UpdatePanel也可能触发非回发。

不过,我希望这可以帮助其他人发现类似的问题。另外,see this article discussing UpdatePanel and Page.Render in more details

相关问题