From 40f7b8bd8c29dd89e20f00169c2f9bc302e3bad8 Mon Sep 17 00:00:00 2001 From: Nathan Heskew Date: Sat, 5 Jun 2010 01:26:14 -0700 Subject: [PATCH] Adding paging to search --HG-- branch : dev --- .../Controllers/SearchController.cs | 26 ++++++-- .../ViewModels/SearchViewModel.cs | 6 +- .../Orchard.Search/Views/Search/Index.ascx | 7 ++- src/Orchard/Mvc/Html/HtmlHelperExtensions.cs | 60 +++++++++++++++++++ 4 files changed, 89 insertions(+), 10 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Search/Controllers/SearchController.cs b/src/Orchard.Web/Modules/Orchard.Search/Controllers/SearchController.cs index 8e4e4e45a..8ad738db8 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Controllers/SearchController.cs +++ b/src/Orchard.Web/Modules/Orchard.Search/Controllers/SearchController.cs @@ -14,14 +14,28 @@ namespace Orchard.Search.Controllers { _contentManager = contentManager; } - public ActionResult Index(string q) { - var searchViewModel = new SearchViewModel {Query = q}; + public ActionResult Index(string q, int page = 0, int pageSize = 0) { + var take = pageSize > 0 ? pageSize : 10; + var skip = (page > 0 ? page - 1 : 0) * take; + var searchViewModel = new SearchViewModel { + Query = q, + Page = page > 0 ? page : 1, + PageSize = take + }; var results = _searchService.Query(q); - searchViewModel.Results = results.Select(result => new SearchResultViewModel { - Content = _contentManager.BuildDisplayModel(_contentManager.Get(result.Id), "SummaryForSearch"), - SearchHit = result - }).ToList(); + + searchViewModel.Count = results.Count(); + searchViewModel.TotalPageCount = searchViewModel.Count/searchViewModel.PageSize; + //todo: deal with page requests beyond result count + searchViewModel.ResultsPage = results + .Select(result => new SearchResultViewModel { + Content = _contentManager.BuildDisplayModel(_contentManager.Get(result.Id), "SummaryForSearch"), + SearchHit = result + }) + .Skip(skip) + .Take(take) + .ToList(); return View(searchViewModel); } diff --git a/src/Orchard.Web/Modules/Orchard.Search/ViewModels/SearchViewModel.cs b/src/Orchard.Web/Modules/Orchard.Search/ViewModels/SearchViewModel.cs index 0ccfa956e..95fe09102 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/ViewModels/SearchViewModel.cs +++ b/src/Orchard.Web/Modules/Orchard.Search/ViewModels/SearchViewModel.cs @@ -3,7 +3,11 @@ using Orchard.Mvc.ViewModels; namespace Orchard.Search.ViewModels { public class SearchViewModel : BaseViewModel { - public IEnumerable Results { get; set; } + public IEnumerable ResultsPage { get; set; } + public int Count { get; set; } + public int Page { get; set; } + public int PageSize { get; set; } + public int TotalPageCount { get; set; } public string Query { get; set; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Search/Views/Search/Index.ascx b/src/Orchard.Web/Modules/Orchard.Search/Views/Search/Index.ascx index cbd81167d..292853320 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Views/Search/Index.ascx +++ b/src/Orchard.Web/Modules/Orchard.Search/Views/Search/Index.ascx @@ -4,8 +4,9 @@ Html.RegisterStyle("search.css"); %>

<%=Html.TitleForPage(T("Search").Text)%>

<% Html.Zone("search"); if (!string.IsNullOrWhiteSpace(Model.Query)) { %> -

<%=T("{0} results", Model.Results.Count()) %>

<% +

<%=T("{0} - {1} of {2} results", (Model.Page - 1) * Model.PageSize + 1, Model.Page * Model.PageSize > Model.Count ? Model.Count : Model.Page * Model.PageSize, Model.Count)%>

<% } -if (Model.Results.Count() > 0) { %> -<%=Html.UnorderedList(Model.Results, (r, i) => Html.DisplayForItem(r.Content).ToHtmlString(), "search-results contentItems") %><% +if (Model.ResultsPage.Count() > 0) { %> +<%=Html.UnorderedList(Model.ResultsPage, (r, i) => Html.DisplayForItem(r.Content).ToHtmlString(), "search-results contentItems") %> +<%=Html.Pager(Model.TotalPageCount, Model.Page, new {q = Model.Query}, "<", ">", false) %><% } %> \ No newline at end of file diff --git a/src/Orchard/Mvc/Html/HtmlHelperExtensions.cs b/src/Orchard/Mvc/Html/HtmlHelperExtensions.cs index aabadcfb4..36b4bd374 100644 --- a/src/Orchard/Mvc/Html/HtmlHelperExtensions.cs +++ b/src/Orchard/Mvc/Html/HtmlHelperExtensions.cs @@ -40,6 +40,66 @@ namespace Orchard.Mvc.Html { return MvcHtmlString.Create(builder.ToString(TagRenderMode.Normal)); } + #region Pager + + public static string Pager(this HtmlHelper html, int pageCount, int currentPage, object values, string previousText, string nextText, bool alwaysShowPreviousAndNext) { + if (pageCount < 2) + return ""; + + var sb = new StringBuilder(75); + var viewContext = html.ViewContext; + var rvd = new RouteValueDictionary(); + + foreach (var item in viewContext.RouteData.Values) { + rvd.Add(item.Key, item.Value); + } + + var urlHelper = new UrlHelper(viewContext.RequestContext); + + if (values != null) { + var rvd2 = new RouteValueDictionary(values); + + foreach (var item in rvd2) { + rvd[item.Key] = item.Value; + } + } + + sb.Append("

"); + + if (currentPage > 1 || alwaysShowPreviousAndNext) { + if (currentPage == 2) + rvd.Remove("page"); + else + rvd["page"] = currentPage - 1; + + sb.AppendFormat(" {0}", previousText, + urlHelper.RouteUrl(rvd)); + } + + //todo: when there are many pages (> 15?) maybe do something like 1 2 3...6 7 8...13 14 15 + for (var p = 1; p <= pageCount; p++) { + if (p == currentPage) { + sb.AppendFormat(" {0}", p); + } + else { + rvd["page"] = p; + sb.AppendFormat(" {0}", p, + urlHelper.RouteUrl(rvd)); + } + } + + if (currentPage < pageCount || alwaysShowPreviousAndNext) { + rvd["page"] = currentPage + 1; + sb.AppendFormat("{0}", nextText, + urlHelper.RouteUrl(rvd)); + } + + sb.Append("

"); + + return sb.ToString(); + } + + #endregion #region UnorderedList