2008-11-10 26 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

相關問題