/// <summary> /// Ajaxes the pager. /// </summary> /// <param name="html">The HTML.</param> /// <param name="options">The options.</param> /// <param name="options">The options.</param> /// <returns></returns> public static string AjaxPager(this HtmlHelper html, PagingOption pagingOptions, AjaxPaginationOption ajaxOptions) { var param = html.ViewContext.HttpContext.Request.Form; // merge data of ajax pagination option and request var data = new RouteValueDictionary(ajaxOptions.Data); if (ajaxOptions.AutoLoadParam == true) { foreach (var key in param.AllKeys) { if (key != null && !data.ContainsKey(key)) { data.Add(key, param[key]); } } } int firstPage = 1; var before = (int)Math.Ceiling((double)(pagingOptions.PageSize / 2)); var after = pagingOptions.PageSize - before; var startPage = Math.Max(1, pagingOptions.CurrentPage - before); int lastPage = (int)Math.Ceiling((double)(pagingOptions.TotalRows) / (double)(pagingOptions.PageSize)); var endPage = Math.Min(lastPage, pagingOptions.CurrentPage + after); var dataObj = Json.Decode <Object>(Json.EncodeDictionary(data)); // autload htmlID var HtmlID = ajaxOptions.HtmlID; if (ajaxOptions.AutoLoadHtmlID == true && param["HtmlID"] != null) { HtmlID = param["HtmlID"]; } string hiddenRefresh = html.ButtonToRemote("", "cmdRefresh", new RemoteOption { URL = pagingOptions.UrlMaker(pagingOptions.CurrentPage), Update = HtmlID, Data = dataObj }, new { style = "display:none" }); if (pagingOptions.TotalRows <= pagingOptions.PageSize) { return(hiddenRefresh); } var ret = new List <String>(); //pager.LinkPattern = linkPagePattern; string currentLinkPattern = "<b>" + pagingOptions.CurrentPage + "</b>"; // first page if (pagingOptions.CurrentPage != firstPage) { ret.Add(html.LinkToRemote("First", new RemoteOption { URL = pagingOptions.UrlMaker(firstPage), Update = HtmlID, Data = dataObj })); } // previous page if (pagingOptions.CurrentPage > 1) { ret.Add(html.LinkToRemote("Previous", new RemoteOption { URL = pagingOptions.UrlMaker(pagingOptions.CurrentPage - 1), Update = HtmlID, Data = dataObj })); } // pages for (int i = startPage; i <= endPage; i++) { if (i == pagingOptions.CurrentPage) { ret.Add(currentLinkPattern); } else { ret.Add(html.LinkToRemote(i.ToString(), new RemoteOption { URL = pagingOptions.UrlMaker(i), Update = HtmlID, Data = dataObj })); } } // next page if (pagingOptions.CurrentPage < endPage) { ret.Add(html.LinkToRemote("Next", new RemoteOption { URL = pagingOptions.UrlMaker(pagingOptions.CurrentPage + 1), Update = HtmlID, Data = dataObj })); } // last page if (pagingOptions.CurrentPage != lastPage) { ret.Add(html.LinkToRemote("Last", new RemoteOption { URL = pagingOptions.UrlMaker(lastPage), Update = HtmlID, Data = dataObj })); } ret.Add(hiddenRefresh); return(String.Join(" ", ret.ToArray())); }