簡體   English   中英

ASP.NET在將頁面的HTML發送到客戶端之前修改它的HTML

[英]ASP.NET modifing the HTML of a page before it is sent to the client

我需要在將ASP.NET發送到客戶端之前捕獲它的HTML,以便對其進行最后一分鍾的字符串操作,然后將修改后的版本發送到客戶端。

例如

加載頁面每個控件都已正確呈現頁面的完整html已准備好轉移回客戶端

在ASP.NET中有沒有辦法解決這個問題

您可以覆蓋頁面的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);
}

您可以使用HTTPModule來更改html。 這是一個例子

使用Atanas Korchev答案幾天,我發現我得到的JavaScript錯誤類似於:

“無法解析從服務器收到的消息”

與ASP.NET Ajax UpdatePanel控件一起使用時。 原因在此博客文章中描述

基本上, 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也可以觸發非回發。

不過,我希望這有助於其他發現類似問題的人。 另外, 請參閱本文,更詳細地討論UpdatePanelPage.Render

看一下ASP.NET頁面生命周期中的事件序列。 是列出事件的一頁。 您可以在頁面的生命周期中找到一個事件來處理這個事件,以便進行更改,但仍然可以渲染這些更改。

如果沒有,您可以隨時編寫一個HttpModule,在頁面本身完成渲染后處理HTTP響應。

顯然,如果你可以首先從ASP.Net中哄騙所需的標記,效率會更高。

考慮到這一點,您是否考慮過使用控制適配器 它們將允許您首先覆蓋每個控件的呈現方式,而不必在以后修改字符串。

我不認為頁面中有特定事件可以掛鈎; 這是ASP.Net生命周期: http//msdn.microsoft.com/en-us/library/ms178472.aspx

您可能需要考慮掛鈎到prerender事件以“調整”控件的值,或執行一些客戶端編輯/回調。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM