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