我有一个自定义 UI 控件,它有一个围绕 AJAX.NET 框架编写的 JavaScript 类。它继承自 Sys.UI.Control。该控件本身是一个 UserControl。在 render 方法中,我将控件包装在一个跨度中,并为跨度的 ID 提供用户控件的 ClientID。这样我以后就可以这样做:
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();
没有任何反应,因为 $find 在 AJAX 调用后没有找到控件。我知道我没有正确地这样做。我哪里错了。有关这些内容的 MSDN 文章让我陷入困境!
编辑:我想我会在 UserControl.cs 部分包含我正在做的 Render 方法
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");
}
最佳答案
您不需要自己编写所有 Sys.Application.add_init
东西;根据 this MSDN article 实现 IScriptControl
.
关键是关于 RegisterScriptControl
和 RegisterScriptDescriptors
的部分,它将您的控件注册到 ScriptManager
以便异步回发将重新创建您的客户端必要时进行控制。
作为脚注,有一个 seperate but similar article here如果您正在实现 Sys.UI.Behavior
。
关于javascript - UpdatePanel 更新时未调用 Sys.Application.add_init,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3639560/