zoukankan      html  css  js  c++  java
  • 使用扩展方法简化RadAjaxManager设置

    相对于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判断里面,每次回发都需要重新设置。

  • 相关阅读:
    PAT甲级1091Acute Stroke
    PAT甲级1076Forwards on Weibo
    PAT甲级1131Subway Map
    PAT甲级1130Infix Expression
    PAT甲级1103Integer Factorization
    PAT甲级1034Head of a Gang
    Blender删除历史材质球未用材质球
    王者荣耀 花木兰 水晶猎龙者 同人3D壁纸 木兰小哥哥也有拧不开瓶盖的时候,嘿嘿嘿 家居服 减布料
    王者荣耀 嫦娥 同人 3D渲染 壁纸 家居服 减布料
    联考6
  • 原文地址:https://www.cnblogs.com/lwme/p/using-extension-method-simplify-radajaxmanager.html
Copyright © 2011-2022 走看看