/// <summary> /// Render HTML pager element for specified search query. /// </summary> /// <param name="html">The html helper object.</param> /// <param name="query">The search query object.</param> /// <param name="htmlAttributes">The html attributes object for the output html element.</param> /// <returns></returns> public static HelperResult Pager(this HtmlHelper html, SearchQuery query, object htmlAttributes = null) { return new HelperResult(writer => { var Url = new UrlHelper(html.ViewContext.RequestContext); var website = html.ViewContext.RouteData.Values["website"].ToString(); var locale = html.ViewContext.RouteData.Values["locale"].ToString(); var _url = App.Get().Context.AppUrl + website + "/" + locale + "search/" + query.Source; var maxPageCount = 10; var curIndex = query.Index; var startIndex = 1; var endIndex = maxPageCount * startIndex; var curPage = (int)Math.Ceiling((decimal)((decimal)curIndex / (decimal)maxPageCount)); if (curPage > 1) startIndex = (curPage * maxPageCount) - maxPageCount + 1; endIndex = startIndex + maxPageCount; if (endIndex > query.TotalPages) endIndex = query.TotalPages; var _params = new List<string>(); var queryString = html.ViewContext.RequestContext.HttpContext.Request.QueryString; if (queryString != null) { foreach (var key in queryString.AllKeys) { if (key.Equals("index", StringComparison.OrdinalIgnoreCase) || key.Equals("size", StringComparison.OrdinalIgnoreCase)) continue; _params.Add(string.Format("{0}={1}", key, queryString[key])); } } var isLast = curPage * maxPageCount >= query.TotalPages; var isFirst = startIndex == 1; var builder = new UriBuilder(); //if (startIndex == endIndex && startIndex == 1) // return; if (isLast) endIndex++; var pageElement = new XElement("div", new XAttribute("class", "d-pager")); pageElement.AddHtmlAttributes(htmlAttributes); if (!isFirst) { pageElement.Add( new XElement("a", new XAttribute("href", Url.BuildUrl(_url, _params)), new XAttribute("title", "First"), new XAttribute("class", "d-ui-widget d-button"), new XElement("span", new XAttribute("class", "d-icon d-icon-first"))), new XElement("a", new XAttribute("href", _url + "?index=" + (curIndex - 1).ToString() + "&size=" + query.Size + (_params.Count > 0 ? ("&" + string.Join("&", _params.ToArray())) : "")), new XAttribute("title", "Prev"), new XElement("span", new XAttribute("class", "d-icon d-icon-prev"))) ); } for (int i = startIndex; i < endIndex; i++) { var pagerItem = new XElement("a", i != curIndex ? i : curIndex); if (i == curIndex) pagerItem.Add(new XAttribute("class", "d-ui-widget d-button d-state-active")); else pagerItem.Add(new XAttribute("class", "d-ui-widget d-button")); if (i != curIndex) pagerItem.Add(new XAttribute("href", _url + "?index=" + i.ToString() + "&size=" + query.Size + (_params.Count > 0 ? ("&" + string.Join("&", _params.ToArray())) : ""))); pageElement.Add(pagerItem); } if (!isLast) { pageElement.Add( new XElement("a", new XAttribute("href", _url + "?index=" + (curIndex + 1).ToString() + "&size=" + query.Size + (_params.Count > 0 ? ("&" + string.Join("&", _params.ToArray())) : "")), new XAttribute("title", "Next"), new XAttribute("class", "d-ui-widget d-button"), new XElement("span", new XAttribute("class", "d-icon d-icon-next"))), new XElement("a", new XAttribute("href", _url + "?index=" + (query.TotalPages).ToString() + "&size=" + query.Size + (_params.Count > 0 ? ("&" + string.Join("&", _params.ToArray())) : "")), new XAttribute("title", "Last"), new XAttribute("class", "d-ui-widget d-button"), new XElement("span", new XAttribute("class", "d-icon d-icon-last"))) ); } writer.Write(pageElement.OuterXml()); }); }
/// <summary> /// Render HTML pager element for specified content query result. /// </summary> /// <param name="html">The html helper object.</param> /// <param name="model"></param> /// <param name="htmlAttributes">The html attributes object for the output html element.</param> /// <returns></returns> public static HelperResult Pager(this HtmlHelper html, ContentQueryResult model, object htmlAttributes = null) { return new HelperResult(writer => { var Url = new UrlHelper(html.ViewContext.RequestContext); if (model.View.AllowPaging) { var maxPageCount = 10; var curIndex = model.Query.Index; var startIndex = 1; var endIndex = maxPageCount * startIndex; var curPage = (int)Math.Ceiling((decimal)((decimal)curIndex / (decimal)maxPageCount)); if (curPage > 1) startIndex = (curPage * maxPageCount) - maxPageCount + 1; endIndex = startIndex + maxPageCount; if (endIndex > model.Query.TotalPages) endIndex = model.Query.TotalPages; var _params = new List<string>(); var queryString = html.ViewContext.RequestContext.HttpContext.Request.QueryString; if (queryString != null) { foreach (var key in queryString.AllKeys) { if (key.Equals("index", StringComparison.OrdinalIgnoreCase) || key.Equals("size", StringComparison.OrdinalIgnoreCase)) continue; _params.Add(string.Format("{0}={1}", key, queryString[key])); } } if (model.Query.TotalPages <=1) return; var isLast = curPage * maxPageCount >= model.Query.TotalPages; var isFirst = startIndex == 1; var builder = new UriBuilder(); if (isLast) endIndex++; var pageElement = new XElement("div", new XAttribute("data-role", "pager"), new XAttribute("data-index", curIndex - 1)); pageElement.AddHtmlAttributes(htmlAttributes); if (!isFirst) { pageElement.Add( new XElement("a", new XAttribute("href", Url.BuildUrl(model.View.Url, _params)), new XAttribute("title", "Go to first page"), new XAttribute("class", "d-ui-widget d-button"), new XElement("span", new XAttribute("class", "d-icon d-icon-first"))), new XElement("a", new XAttribute("href", Url.Content(model.View.Url) + "?index=" + (curIndex - 1).ToString() + "&size=" + model.Query.Size + (_params.Count > 0 ? ("&" + string.Join("&", _params.ToArray())) : "")), new XAttribute("title", "Go to prev page"), new XAttribute("class", "d-ui-widget d-button"), new XElement("span", new XAttribute("class", "d-icon d-icon-prev"))) ); } for (int i = startIndex; i < endIndex; i++) { var pagerItem = new XElement("a", i != curIndex ? i : curIndex); //if (i == curIndex) // pagerItem.Add(new XAttribute("class", "d-ui-widget d-button d-state-active")); //else pagerItem.Add(new XAttribute("class", "d-ui-widget d-button")); if (i != curIndex) pagerItem.Add(new XAttribute("href", Url.Content(model.View.Url) + "?index=" + i.ToString() + "&size=" + model.Query.Size + (_params.Count > 0 ? ("&" + string.Join("&", _params.ToArray())) : ""))); pageElement.Add(pagerItem); } if (!isLast) { pageElement.Add( new XElement("a", new XAttribute("href", Url.Content(model.View.Url) + "?index=" + (curIndex + 1).ToString() + "&size=" + model.Query.Size + (_params.Count > 0 ? ("&" + string.Join("&", _params.ToArray())) : "")), new XAttribute("title", "Go to next page"), new XAttribute("class", "d-ui-widget d-button"), new XElement("span", new XAttribute("class", "d-icon d-icon-next"))), new XElement("a", new XAttribute("href", Url.Content(model.View.Url) + "?index=" + (model.Query.TotalPages).ToString() + "&size=" + model.Query.Size + (_params.Count > 0 ? ("&" + string.Join("&", _params.ToArray())) : "")), new XAttribute("title", "Go to last page"), new XAttribute("class", "d-ui-widget d-button"), new XElement("span", new XAttribute("class", "d-icon d-icon-last"))) ); } writer.Write(pageElement.OuterXml()); } }); }