@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掉

你可能感兴趣的:(action)