Javascript 更新面板更新时未调用Sys.Application.add_init
我有一个自定义UI控件,它有一个围绕AJAX.NET框架编写的JavaScript类。它继承自Sys.UI.Control。控件本身是一个UserControl。在render方法中,我将控件包装在一个span中,并为span的id指定用户控件的ClientID。这样,我可以在以后执行此操作:Javascript 更新面板更新时未调用Sys.Application.add_init,javascript,ajax,asp.net-ajax,updatepanel,Javascript,Ajax,Asp.net Ajax,Updatepanel,我有一个自定义UI控件,它有一个围绕AJAX.NET框架编写的JavaScript类。它继承自Sys.UI.Control。控件本身是一个UserControl。在render方法中,我将控件包装在一个span中,并为span的id指定用户控件的ClientID。这样,我可以在以后执行此操作: var control = $find('<%= ServerControlID.ClientID %>'); var-control=$find(“”); 这允许我获取表示UI控件的客户
var control = $find('<%= ServerControlID.ClientID %>');
var-control=$find(“”);
这允许我获取表示UI控件的客户端对象
我通过这样做在Javascript中创建控件(也在render方法中)
writer.Write(@)
Sys.Application.add_init(函数(){
调试器;
$create(General.Filters.AccountGroupFilter,
“+GetProperties()+@”,
无效的
无效的
$get(“+this.ClientID+@”);
});
");
这将创建对象。它是在生命周期的init事件中完成的
问题是该控件被消费页/控件包装在UpdatePanel中。当另一个控件启动更新时,所有控件的UI都会重新绘制,但init事件不会再次触发
当我这样做时会发生什么:
var control = $find('<%= ServerControlID.ClientID %>');
if(control != null)
control.doSomething();
var-control=$find(“”);
if(控件!=null)
对照组:doSomething();
因为$find在AJAX调用后找不到控件,所以不会发生任何事情。我知道我做得不对。我哪里做错了。MSDN关于这方面的文章让我陷入了困境
编辑:我想我应该在UserControl.cs部分包含我正在执行的渲染方法
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");
}
受保护的覆盖无效渲染(HtmlTextWriter)
{
作者:写(“”);
writer.Write(@)
Sys.Application.add_init(函数(){
$create(TradePMR.OMS.Resources.UserControls.General.Filters.AccountGroupFilter,
“+GetProperties()+@”,
无效的
无效的
$get(“+this.ClientID+@”);
});
");
base.Render(writer);
writer.WriteEndTag(“span”);
}
你不需要自己编写所有的Sys.Application.add_init
东西;按照执行IScriptControl
关键是关于RegisterScriptControl
和RegisterScriptDescriptor
的部分,它将控件注册到ScriptManager
,以便异步回发将根据需要重新创建客户端控件
作为一个脚注,如果您正在实现Sys.UI.Behavior
。您不需要自己编写所有Sys.Application.add_init
内容;按照执行IScriptControl
关键是关于RegisterScriptControl
和RegisterScriptDescriptor
的部分,它将控件注册到ScriptManager
,以便异步回发将根据需要重新创建客户端控件
作为一个脚注,如果您正在实现Sys.UI.Behavior
,则会出现一个错误
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");
}