@Ajax.RenderAction 把局部页改为ajax加载

页面上局部页多了很拖速度。

尤其是第一次加载,debug=false也没好到哪儿去

 

考虑把Html.RenderAction调用的局部页,替换为ajax加载,但是要替换的地方实在是太多了。

如果都手写ajax代码,很烦人,所以参考ms提供的jquery.unobtrusive-ajax.js写一个扩展方法

核心思想是,先生成一个div,在div上给一些参数,页面加载完成后,根据这些参数发起ajax请求

比如已经有一个div

<div id="container" class="ajaxload index_perBorder" data-ajax-update="#container" data-ajax-mode="replace" data-ajax-loading="" data-ajax="true" ajax-url="/xxxxx/yyyy">

这个div需要一个id,当ajax请求返回时,内容会放置到此div内

  1: $(function () {
  2:         $("div[data-ajax=true]").each(function () {
  3:             var url = $(this).attr("ajax-url");
  4:             if ($(this).attr("data-ajax-loading") != null && $(this).attr("data-ajax-loading") !="") {
  5:                 var loadingid = $(this).attr("data-ajax-loading");
  6:                 var loadEle = $(loadingid);
  7:                 $(this).empty().html(loadEle.clone().show());
  8:                 $(this).attr("data-ajax-loading", "");
  9:             }
 10:             asyncRequest(this, {
 11:                 url: url,
 12:                 type: "GET",
 13:                 data: []
 14:             });
 15: 
 16:         });
 17:     });

在jquery.unobtrusive-ajax.js中加入以上代码,注意应该加载} (jQuery));之前,因为用到他内部的一些方法

剩下就是如何生成这个div了

  1:         public static MvcHtmlString RenderAction(this AjaxHelper ajaxHelper, string containerID, string actionName, string controllerName, RouteValueDictionary routeValues)
  2:         {
  3:             return RenderAction(ajaxHelper, containerID, actionName, controllerName, routeValues, new AjaxOptions { },null);
  4:         }
  5: 
  6:         public static MvcHtmlString RenderAction(this AjaxHelper ajaxHelper, string actionName, string controllerName, RouteValueDictionary routeValues)
  7:         {
  8:             return RenderAction(ajaxHelper, controllerName + "-" + actionName, actionName, controllerName, routeValues, new AjaxOptions { },null);
  9:         }
 10:         public static MvcHtmlString RenderAction(this AjaxHelper ajaxHelper, string actionName, string controllerName, object routeValues)
 11:         {
 12:             return RenderAction(ajaxHelper, controllerName + "-" + actionName, actionName, controllerName, routeValues, new AjaxOptions { },null);
 13:         }
 14: 
 15:         public static MvcHtmlString RenderAction(this AjaxHelper ajaxHelper, string containerID, string actionName, string controllerName, object routeValues)
 16:         {
 17:             return RenderAction(ajaxHelper, containerID, actionName, controllerName, routeValues);
 18:         }
 19: 
 20:         public static MvcHtmlString RenderAction(this AjaxHelper ajaxHelper, string containerID, string actionName, string controllerName, RouteValueDictionary routeValues, AjaxOptions ajaxOptions, IDictionary<string, object> htmlAttributes)
 21:         {
 22:             if (String.IsNullOrEmpty(containerID))
 23:             {
 24:                 throw new ArgumentException("必须指定容器ID","containerID");
 25:             }
 26: 
 27:             string targetUrl = UrlHelper.GenerateUrl(null /* routeName */, actionName, controllerName, routeValues, ajaxHelper.RouteCollection, ajaxHelper.ViewContext.RequestContext, true /* includeImplicitMvcValues */);
 28: 
 29:             return MvcHtmlString.Create(GenerateLink(ajaxHelper, containerID, targetUrl, ajaxOptions, htmlAttributes));
 30:         }
 31: 
 32:         private static string GenerateLink(AjaxHelper ajaxHelper,string containerid,  string targetUrl, AjaxOptions ajaxOptions, IDictionary<string, object> htmlAttributes)
 33:         {
 34:             if (string.IsNullOrEmpty(ajaxOptions.UpdateTargetId))
 35:             {
 36:                 ajaxOptions.UpdateTargetId = containerid;
 37:             }
 38:             var tag = new TagBuilder("div");
 39:             tag.MergeAttributes(htmlAttributes);
 40:             tag.MergeAttribute("id", containerid);
 41:             tag.MergeAttribute("ajax-url", targetUrl);
 42:             tag.MergeAttributes(ajaxOptions.ToUnobtrusiveHtmlAttributes());
 43:             return tag.ToString();
 44:         }
 45: 
 46:         public static MvcHtmlString RenderAction(this AjaxHelper ajaxHelper, string containerID, string actionName, string controllerName, object routeValues, AjaxOptions ajaxOptions, object htmlAttributes)
 47:         {
 48:             RouteValueDictionary newValues = new RouteValueDictionary(routeValues);
 49:             RouteValueDictionary newAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
 50:             return RenderAction(ajaxHelper, containerID, actionName, controllerName, newValues, ajaxOptions, newAttributes);
 51:         }

若干种重载

调用:

@Ajax.RenderAction("container", "action", "controller", new { 参数 }, new AjaxOptions { LoadingElementId="ajaxloading" }, new { });
如果没有 指定UpdateTargetID,只更新到 “container” (生成的div),如果给了则更新到给定的容器中。同样可以通过onbegin onsuccess等参数来调用一些额外的js。
loadingelementid会把指定的元素复制一个到container中,update时被update掉了,如果不是更新到container,则由jquery.unobtrusive-ajax.js hide掉
posted @ 2012-07-25 17:38  czcz1024  阅读(457)  评论(0编辑  收藏  举报