2010-09-03 70 views
2

我有一個自定義UI控件,它具有圍繞AJAX.NET框架編寫的JavaScript類。它從Sys.UI.Control繼承。該控件本身是一個UserControl。在渲染方法中,我將控件包裝在一個範圍內,併爲span的id提供用戶控件的ClientID。這種方式我可以稍後做:Sys.Application.add_init未在UpdatePanel上更新

var control = $find('<%= ServerControlID.ClientID %>'); 

這使我能夠獲得表示UI控件的客戶端對象。

我做這個(也是在渲染方法)創建JavaScript中的控制

writer.Write(@"<script type='text/javascript'> 
Sys.Application.add_init(function() { 
debugger; 
    $create(General.Filters.AccountGroupFilter, 
     " + GetProperties() + @", 
     null, 
     null, 
     $get('" + this.ClientID + @"')); 
}); 
</script>"); 

這將創建對象。它是在生命週期的init事件中完成的。

問題在於,這個控件被一個消費頁面/控件包裝在UpdatePanel中。當另一個控件啓動更新時,所有控件的UI都會重繪,但是init事件再也不會啓動。

然後會發生什麼事是,當我這樣做:

var control = $find('<%= ServerControlID.ClientID %>'); 
if(control != null) 
    control.doSomething(); 

什麼也沒有發生,因爲$找到沒有找到AJAX調用後的控制。我知道我沒有正確地做到這一點。我哪裏錯了。這篇文章的MSDN文章正指向我圈子!

編輯:想我會包括

protected override void Render(HtmlTextWriter writer) 
    { 
     writer.Write("<span id=\"" + this.ClientID + "\" >"); 
     writer.Write(@"<script type='text/javascript'> 
     Sys.Application.add_init(function() { 

     $create(TradePMR.OMS.Resources.UserControls.General.Filters.AccountGroupFilter, 
     " + GetProperties() + @", 
     null, 
     null, 
     $get('" + this.ClientID + @"')); 
     }); 
     </script>"); 

     base.Render(writer); 
     writer.WriteEndTag("span"); 
    } 

回答

0

你並不需要編寫所有的Sys.Application.add_init自己的東西Render方法,我做的UserControl.cs部分;根據this MSDN article執行IScriptControl

關鍵是關於RegisterScriptControlRegisterScriptDescriptors的部分,它將您的控件註冊到ScriptManager,以便異步回發將根據需要重新創建客戶端控件。

作爲腳註,如果您正在實施Sys.UI.Behavior,則有seperate but similar article here