代码改变世界

使用扩展方法简化RadAjaxManager设置

2013-10-19 16:31 by 囧月, ... 阅读, ... 评论, 收藏, 编辑

相对于RadAjaxPanel,RadAjaxManager提供了更精确控制更新目标的设置,特别是在某些场景下,使用RadAjaxManager能够获得更好的性能。

但是,由于要明确设置目标,配置的代码显得比较繁琐,比如这样简单的控件:

<asp:xxx id="source1" ... />
<asp:xxx id="source2" ... />
<asp:xxx id="source3" ... />
<asp:xxx id="target" ... />

它的配置代码看起来非常多,经常可以见到大量这样的代码:

<telerik:RadAjaxManager runat="server" ID="lwme">
  <AjaxSettings>
    <telerik:AjaxSetting AjaxControlID="source1">
      <UpdatedControls>
        <telerik:AjaxUpdatedControl ControlID="target" />
      </UpdatedControls>
    </telerik:AjaxSetting>
    <telerik:AjaxSetting AjaxControlID="source2">
      <UpdatedControls>
        <telerik:AjaxUpdatedControl ControlID="target" />
      </UpdatedControls>
    </telerik:AjaxSetting>
    <telerik:AjaxSetting AjaxControlID="source3">
      <UpdatedControls>
        <telerik:AjaxUpdatedControl ControlID="target" />
      </UpdatedControls>
    </telerik:AjaxSetting>

针对这种情况,可以简化为如下代码:

<asp:PlaceHolder id="phlwme" ...>
  <asp:xxx id="source1" ... />
  <asp:xxx id="source2" ... />
  <asp:xxx id="source3" ... />  
</asp:PlaceHolder>
<asp:xxx id="target" ... />

<telerik:RadAjaxManager runat="server" ID="lwme">
  <AjaxSettings>
    <telerik:AjaxSetting AjaxControlID="phlwme">
      <UpdatedControls>
        <telerik:AjaxUpdatedControl ControlID="target" />
      </UpdatedControls>
    </telerik:AjaxSetting>

但是,实际应用中,这几个source可能不能被包含在一个容器中(容器中可能有其他元素),否则会造成性能浪费;这个时候,通过后端代码优化显得更加有效。

一个简单的扩展方法实现如下:

public static class RadAjaxManagerExtensions_By_Lwme_At_Cnblogs
{
    /// <summary>
    /// 为多个源控件设置同一个更新目标
    /// </summary>
    /// <param name="manager"></param>
    /// <param name="target"></param>
    /// <param name="sources"></param>
    public static void AddAjaxSettingToSameTarget(this RadAjaxManager manager, Control target, params Control[] sources)
    {
        foreach (var source in sources)
        {
            AddAjaxSetting(manager, source, target);
        }
    }

    static bool IsControlValid(Control control)
    {
        return !string.IsNullOrEmpty(control.ID) &&
            !(control is LiteralControl); // LiteralControl 为普通的文本
    }

    /// <summary>
    /// 为同一个源控件设置多个更新目标
    /// </summary>
    /// <param name="manager"></param>
    /// <param name="sourceControl"></param>
    /// <param name="targets"></param>
    public static void AddAjaxSetting(this RadAjaxManager manager, Control sourceControl, params Control[] targets)
    {
        var setting = new AjaxSetting(sourceControl.ID);
        foreach (var target in targets)
        {
            if (!IsControlValid(target))
                continue;

            var update = new AjaxUpdatedControl();
            update.ControlID = target.ID;
            setting.UpdatedControls.Add(update);
        }
        manager.AjaxSettings.Add(setting);
    }
}

前面的配置代码就可以简化为如下调用:

lwme.AddAjaxSettingToSameTarget(target, source1, srouce2, source3)

对于同一个源控件更新多个目标的,可以使用以下代码:

lwme.AddAjaxSetting(source, target1, target2, target3)

在调用以上代码进行设置的时候需要注意,不能放在IsPostback判断里面,每次回发都需要重新设置。