相对于RadAjaxPanel,RadAjaxManager提供了更精确控制更新目标的设置,特别是在某些场景下,使用RadAjaxManager能够获得更好的性能。
但是,由于要明确设置目标,配置的代码显得比较繁琐,比如这样简单的控件:
class="brush: xml; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 2; toolbar: true;"><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判断里面,每次回发都需要重新设置。