用户控件中的RadAjaxManager,每页最多一个这样的管理器

时间:2015-04-29 09:58:25

标签: c# asp.net ajax telerik

如果您尝试将RadAjaxManager添加到您的网页两次,这是众所周知的错误:

  

只能将一个RadAjaxManager实例添加到页面

Telerik explains如何通过代理控制解决设计时问题。

对于我们在页面上使用的大多数控件,此错误不会触发,即使这些控件中的每一个都有RadAjaxManager,有时甚至在转发器内(意外,但仍然,错误没有&# 39; t throw)。但是,使用一个这样的控件(一个动态按钮)我们已经将它添加到页面上的几个位置没有问题,可能因为这是完全相同的控件,但是嵌套在另一个控件中我们再次收到上面的错误,只要我们将其添加到页面。

我试图通过以下方式解决它:

  • 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);
        }
    }
    
    • 上述
    • 的几个变体

结果是:从未找到控件,因此多次添加,导致上述错误,或者在用户控件中的其他控件的过程中添加了控件但过晚,导致多个AJAX事件没有发生。

我应该如何将RadAjaxManager添加到用户控件中,该控件本身在其他几个用户控件中使用,这样管理器只在页面上出现一次和/或RadAjaxManager.GetCurrent实际上作品?

1 个答案:

答案 0 :(得分:1)

平面A - 将RadAjaxManager添加到页面级别,而不是添加到用户控件。因此,用户控件可以有RadAjaxManagerProxy控件,静态GetCurrent()方法也可以。

计划B - 如果您想要自包含的用户控件,请使用RadAjaxPanel控件。他们有一个ajaxRequest()客户端方法和一个服务器端事件,由于用户控件通常很小,你可能会为他们提供一个面板。

计划C - 将AJAX设置保留到父页面。如果父用户控件已启用AJAX,则其整个内容将随回发一起传播,因此在内部用户控件上获得更多AJAX设置可能无法为您带来性能优势。

计划D - 仅使用asp:使用UpdateMode = Conditional的UpdatePanel控件,这样您就可以对部分渲染进行非常精细的控制。