我们都知道AJAX不能直接请求UserControl.ascx数据,所以这里只能采用迂回的办法了。比如AJAX先请求GetUserControl.ashx处理程序,GetUserControl.ashx根据请求加载对应UserControl后,再将该UserControl内容返回给客服端。这里实现方法可参照老赵文章“技巧:使用UserControl做HTML生成”。
项目Default.aspx页面里设置AJAX请求:
///AJAX加载用户控件 ///请求获取的控件名 ///要加载控件内容的区域 kity_utils.getUserControl = function (controlName, controlSite) { $.ajax({ type: "get", url: "GetUserControl.ashx?tt=" + new Date().getSeconds() + "", dataType: "html", data: "userControl=" + controlName + "", success: function (data) { if (data != "" || data != null) { $(controlSite).html(data); } } }); };
这里是我写的一个JS工具库,并将其附加到Jquery上,故调用时:
$.kity_utils.getUserControl(“sealInfo”, "#show_box");
在GetUserControl.ashx中实现如下:
if (context.Request["userControl"] != null) { string controName = context.Request["userControl"]; string html = ""; switch (controName) { case Utils.UserControlName.SealInfo: html = Utils.GetUserControl.UserControlContent("Control/SealInfo.ascx"); break; } Utils.WriteToAjax.WriteContentToAjax(html); }
在GetUserControl类中的实现如下:
public static string UserControlContent(string controlPath) { Page page = new Page(); System.Web.UI.Control userControl = page.LoadControl(controlPath); page.Controls.Add(userControl); StringWriter textWriter = new StringWriter(); HttpContext.Current.Server.Execute(page, textWriter, false); string html = textWriter.ToString(); textWriter.Dispose(); return html;
}
通过这样的解决方法,可以很好的实现AJAX的数据交互了,没有HTML拼接代码,仅仅使用UserControl控件完成各式各样的HTML片段生成,既方便又快速。而我在整个项目都是采用都是采用这样的方法实现,即使是印章制作模块的数据交互。当然,这里涉及到项目数据条目的显示,就肯定有分页了,而都是AJAX架构,并且我使用Repeater控件做数据绑定,所以这里将在下一篇进行总结。