用户控件中的 RadAjaxManager,每页最多有一个这样的管理器
RadAjaxManager in a user control with at most one such manager per page
如果您尝试将 RadAjaxManager
添加到您的页面两次,这是一个众所周知的错误:
Only one instance of a RadAjaxManager can be added to the page
Telerik explains 如何使用代理控件解决设计时问题。
对于我们在页面上使用的大多数控件,不会触发此错误,即使这些控件中的每一个都有一个 RadAjaxManager
,有时甚至在转发器中(意外地,但仍然是错误不扔)。但是,使用一个这样的控件(一个动态按钮),我们可以毫无问题地将它添加到页面上的多个位置,这可能是因为它们都是同一个控件,但嵌套在另一个控件中,我们再次收到上面的错误,只要我们将其添加到页面。
我尝试通过以下方式解决:
- adding the control dynamically 到页面,但是由于控件事件在页面事件之前触发,这导致一些动态行为不再发生。
仅将 RadAjaxManager
动态添加到控件中一次,使用内置的额外检查,如下所示:
private RadAjaxManager GetAjaxManager()
{
var ctl = this.FindControl("ajaxManager");
if (ctl != null)
{
return (RadAjaxManager)ctl;
}
// alternative method
var mgr = RadAjaxManager.GetCurrent(this.Page);
if (mgr != null)
{
return mgr;
}
// control is never found, always returns null
return null;
}
protected override void OnInit(EventArgs e)
{
if (this.GetAjaxManager() == null)
{
// ajax mgr is never found, and this always throws
// "cannot add multiple times" error
var ajaxManager = new RadAjaxManager();
ajaxManager.ID = "ajaxManager";
this.Controls.Add(ajaxManager);
}
}
- 上述的几种变体
结果是:从未找到该控件,因此添加了不止一次,导致上述错误,或者添加了该控件,但在 usercontrol 中的其他控件的过程中为时已晚,导致几个 AJAX 事件没有发生。
我应该如何将 RadAjaxManager
添加到一个用户控件中,该用户控件本身在其他几个用户控件中使用,这样管理器只在页面 and/or 上出现一次,这样 RadAjaxManager.GetCurrent
真的有用吗?
Plane A - 将 RadAjaxManager 添加到页面级别,而不是用户控件。因此,用户控件可以有 RadAjaxManagerProxy 控件,静态 GetCurrent() 方法将起作用。
B 计划 - 如果您想要独立的用户控件,请使用 RadAjaxPanel 控件。他们有一个 ajaxRequest() 客户端方法和一个服务器端事件,并且由于用户控件通常很小,您可能可以为他们使用一个面板。
C 计划 - 将 AJAX 设置留给父页面。如果父用户控件已经 AJAX 启用,其全部内容将随回传一起传输,因此需要更多 AJAX 内部用户控件设置可能不会给您带来性能优势。
计划 D - 仅使用 asp:UpdatePanel 控件和 UpdateMode=Conditional,这样您就可以对局部渲染进行极其精细的控制。
如果您尝试将 RadAjaxManager
添加到您的页面两次,这是一个众所周知的错误:
Only one instance of a RadAjaxManager can be added to the page
Telerik explains 如何使用代理控件解决设计时问题。
对于我们在页面上使用的大多数控件,不会触发此错误,即使这些控件中的每一个都有一个 RadAjaxManager
,有时甚至在转发器中(意外地,但仍然是错误不扔)。但是,使用一个这样的控件(一个动态按钮),我们可以毫无问题地将它添加到页面上的多个位置,这可能是因为它们都是同一个控件,但嵌套在另一个控件中,我们再次收到上面的错误,只要我们将其添加到页面。
我尝试通过以下方式解决:
- adding the control dynamically 到页面,但是由于控件事件在页面事件之前触发,这导致一些动态行为不再发生。
仅将
RadAjaxManager
动态添加到控件中一次,使用内置的额外检查,如下所示:private RadAjaxManager GetAjaxManager() { var ctl = this.FindControl("ajaxManager"); if (ctl != null) { return (RadAjaxManager)ctl; } // alternative method var mgr = RadAjaxManager.GetCurrent(this.Page); if (mgr != null) { return mgr; } // control is never found, always returns null return null; } protected override void OnInit(EventArgs e) { if (this.GetAjaxManager() == null) { // ajax mgr is never found, and this always throws // "cannot add multiple times" error var ajaxManager = new RadAjaxManager(); ajaxManager.ID = "ajaxManager"; this.Controls.Add(ajaxManager); } }
- 上述的几种变体
结果是:从未找到该控件,因此添加了不止一次,导致上述错误,或者添加了该控件,但在 usercontrol 中的其他控件的过程中为时已晚,导致几个 AJAX 事件没有发生。
我应该如何将 RadAjaxManager
添加到一个用户控件中,该用户控件本身在其他几个用户控件中使用,这样管理器只在页面 and/or 上出现一次,这样 RadAjaxManager.GetCurrent
真的有用吗?
Plane A - 将 RadAjaxManager 添加到页面级别,而不是用户控件。因此,用户控件可以有 RadAjaxManagerProxy 控件,静态 GetCurrent() 方法将起作用。
B 计划 - 如果您想要独立的用户控件,请使用 RadAjaxPanel 控件。他们有一个 ajaxRequest() 客户端方法和一个服务器端事件,并且由于用户控件通常很小,您可能可以为他们使用一个面板。
C 计划 - 将 AJAX 设置留给父页面。如果父用户控件已经 AJAX 启用,其全部内容将随回传一起传输,因此需要更多 AJAX 内部用户控件设置可能不会给您带来性能优势。
计划 D - 仅使用 asp:UpdatePanel 控件和 UpdateMode=Conditional,这样您就可以对局部渲染进行极其精细的控制。