如果您尝试将RadAjaxManager
添加到您的网页两次,这是众所周知的错误:
只能将一个RadAjaxManager实例添加到页面
Telerik explains如何通过代理控制解决设计时问题。
对于我们在页面上使用的大多数控件,此错误不会触发,即使这些控件中的每一个都有RadAjaxManager
,有时甚至在转发器内(意外,但仍然,错误没有&# 39; t throw)。但是,使用一个这样的控件(一个动态按钮)我们已经将它添加到页面上的几个位置没有问题,可能因为这是完全相同的控件,但是嵌套在另一个控件中我们再次收到上面的错误,只要我们将其添加到页面。
我试图通过以下方式解决它:
仅对控件动态添加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);
}
}
结果是:从未找到控件,因此多次添加,导致上述错误,或者在用户控件中的其他控件的过程中添加了控件但过晚,导致多个AJAX事件没有发生。
我应该如何将RadAjaxManager
添加到用户控件中,该控件本身在其他几个用户控件中使用,这样管理器只在页面上出现一次和/或RadAjaxManager.GetCurrent
实际上作品?
答案 0 :(得分:1)
平面A - 将RadAjaxManager添加到页面级别,而不是添加到用户控件。因此,用户控件可以有RadAjaxManagerProxy控件,静态GetCurrent()方法也可以。
计划B - 如果您想要自包含的用户控件,请使用RadAjaxPanel控件。他们有一个ajaxRequest()客户端方法和一个服务器端事件,由于用户控件通常很小,你可能会为他们提供一个面板。
计划C - 将AJAX设置保留到父页面。如果父用户控件已启用AJAX,则其整个内容将随回发一起传播,因此在内部用户控件上获得更多AJAX设置可能无法为您带来性能优势。
计划D - 仅使用asp:使用UpdateMode = Conditional的UpdatePanel控件,这样您就可以对部分渲染进行非常精细的控制。