2010-09-03 65 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