2013-02-06 15 views
2

我已經繼承了System.Web.UI.HtmlTextWriter在ASP.NET應用程序中執行HTML的一些自定義呈現。這是在我的Web.config文件配置爲使用下列內容:如何爲ASP.NET AJAX UpdatePanel請求重寫HtmlTextWriter?

<browserCaps> 
    tagwriter="MyAssembly.CustomHtmlTextWriter, MyAssembly" 
</browserCaps> 

這工作正常進行定期的頁面請求,被覆蓋的方法,如OnTagRender被稱爲和定製的HTML被髮送到瀏覽器。

但是,當使用UpdatePanel進行異步回發時,從不調用此代碼,並且HTML未到達瀏覽器而沒有進行自定義修改。我是否缺少一些會爲我的自定義HtmlTextWriter加載AJAX請求的配置?

回答

3

首先,我可以向您保證您的自定義HTMLTextWriter被正確調用,並且您在配置中沒有任何錯誤。

使用你的web.config部分,我寫了一個測試程序,幷包含在var cap = ...線下面的斷點:

protected void UpdatePanel1_Load(object sender, EventArgs e) 
    { 
     var cap = Request.Browser.TagWriter; 
    } 

在兩個初始HTTP GET和AJAX回傳,斷點被擊中,並我可以看到正在使用的TagWriter實際上是CustomHtmlTextWriter。另外,我可以在CustomHtmlTextWriter構造函數上設置一個斷點,並在回發時觸發此斷點。

我還確認,即使您在回發中添加了全新的控件,即使調用了CustomHtmlTextWriter構造函數,OnTagRender,OnAttributeRender和其他事件也不會觸發。

此外,RenderBefore ...()和RenderAfter ...()方法不會被調用。

所以這回答你的問題「我在配置中做了什麼錯誤?」:不,你不是。您的自定義HtmlTextWriter被實例化並被引用,但沒有調用其有用的方法(調用BeginRender,但是通常不會使用您通常用來更改標記的方法)。

在這一點上,值得注意的是,bro​​wserCaps標記在.NET 2.0中已被棄用,因此您的用例似乎不被支持也許並不奇怪。根據你想要做什麼,我認爲ControlAdapter體系結構應該完成工作。

例如,我們假設我想用僅包含其ID的span來替換所有TextBoxes和Labels,並且在初始GET和AJAX回發上進行此項工作。當然你的例子會更復雜,但希望這種簡化會給你這個想法。

所有我需要做的是建立一個的ControlAdapter可以在任何網絡控制法:

public class CustomControlAdapter : WebControlAdapter 
{ 
    protected override void RenderBeginTag(HtmlTextWriter writer) 
    { 
     writer.WriteLine(); 
     writer.WriteBeginTag("span"); 
     writer.Write(HtmlTextWriter.TagRightChar); 
    } 

    protected override void RenderEndTag(HtmlTextWriter writer) 
    { 
     writer.WriteEndTag("/span"); 
     writer.WriteLine(); 
    } 

    protected override void RenderContents(HtmlTextWriter writer) 
    { 
     writer.WriteLine(Control.ID); 
    } 
} 

然後,我線它到多種控制我感興趣的工作的。我這樣做,通過創建在App_Browsers文件文件夾中的文件Adapters.browser,幷包括以下配置:

<browsers> 
    <browser refID="Default"> 
    <controlAdapters> 
     <adapter 
     controlType="System.Web.UI.WebControls.Label" 
     adapterType="WebApplication1.CustomControlAdapter" 
     /> 
     <adapter 
     controlType="System.Web.UI.WebControls.TextBox" 
     adapterType="WebApplication1.CustomControlAdapter" 
     /> 
    </controlAdapters> 
    </browser> 
</browsers> 

請注意,我的瀏覽器的「默認」 REFID將會對所有的瀏覽器這項工作。現在,當需要呈現Label或TextBox Web控件時,CustomControlAdapter將負責處理它。上面的代碼在我的示例應用程序中進行了測試,並且即使使用AJAX也能完美運行。在你的情況下,我想你只需要添加幾個控制類型到適配器。瀏覽器文件,你應該是100%的業務。

+0

如果browserCaps標記已被棄用,是否有其他配置自定義HtmlTextWriter的方法?如果沒有,ControlAdapter體系結構可能是我解決問題的一種可行方法。謝謝你的幫助。 –

+1

我在這上面花了大約4-5個小時 - 我真的瞭解它 - 而且我無法讓自定義的HtmlTextWriter工作。我在AJAX調用中反映了很多堆棧,出於某種原因,它根本不會在AJAX上調用這些事件,但我無法弄清楚原因。儘管我發現原因,但似乎很難有任何可以做到的事情。這看起來好像他們現在正在推進ControlAdapter體系結構。 –