我有一個自定義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");
}