Справка по разбивке на страницы MVC со строкой запроса - PullRequest
0 голосов
/ 12 января 2011

Я пытаюсь собрать очень простое приложение с использованием ASP.NET MVC, которое показывает новостные статьи и разбивает их на страницы.Я на полпути, но мне нужна помощь, чтобы разобраться с нумерацией страниц и заставить ее работать с поисковым запросом.Это НЕ дублирование этого вопроса (Домашняя работа) Справка по нумерации MVC , поскольку оно касается ведения поискового запроса при использовании нумерации страниц и было рекомендовано для начала нового вопроса.

Вот мойHomeController:

public ActionResult Index(String query, int? page)
{
        // limit the number of articles per page
        const int pageSize = 4;
        // build the query
        var ArticleQuery = from a in _db.ArticleSet select a;
        // check if their is a query
        if (!string.IsNullOrEmpty(query))
        {
            ArticleQuery = ArticleQuery.Where(a => a.headline.Contains(query));
        }
        // orders the articles
        var OrderedArticles = ArticleQuery.OrderByDescending(a => a.posted);
        // takes the ordered articles and paginates them
        //var paginatedArticles = new PaginatedList(OrderedArticles.Skip((page ?? 0) * pageSize).Take(pageSize), page ?? 0, pageSize);
        var paginatedArticles = new PaginatedList<Article>(OrderedArticles, page ?? 0, pageSize);
        // return the paginated articles to the view
        return View(paginatedArticles);
}

Идея состоит в том, что контроллер показывает 4 элемента на странице, упорядочив их по дате.Вот вид, который у меня есть для метода Index:

<ul id="pagination">
    <% if (Model.PreviousPage) { %>
        <li><%= Html.ActionLink("<< First Page", "Index")%></li>
        <li><%= Html.ActionLink("<< Previous Page", "Index", new { page=(Model.PageIndex-1) }) %></li>
    <% } %>
    <% if (Model.NextPage) { %>
        <li><%= Html.ActionLink("Next Page >>", "Index", new { page = (Model.PageIndex + 1) })%></li>
        <li><%= Html.ActionLink("Last Page >>", "Index", new { page = (Model.TotalPages - 1) })%></li>
    <% } %>    
</ul>

Идея состоит в том, что эти две ссылки на нумерацию страниц будут показываться только при выполнении условий.

Наконец, вот класс PaginatedList дляпейджер:

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace NewsApp.Models
{
    public class PaginatedList<T> : List<T>
    {
        public int PageIndex { get; private set; }
        public int PageSize { get; private set; }
        public int TotalCount { get; private set; }
        public int TotalPages { get; private set; }

        public PaginatedList(IQueryable<T> source, int pageIndex, int pageSize)
        {
            PageIndex = pageIndex;
            PageSize = pageSize;
            TotalCount = source.Count();
            TotalPages = (int)Math.Ceiling(TotalCount / (double)PageSize);

            this.AddRange(source.Skip(PageIndex * PageSize).Take(PageSize));
        }
        public bool HasPreviousPage
        {
            get
            {
                return (PageIndex > 0);
            }
        }
        public bool HasNextPage
        {
            get
            {
                return (PageIndex + 1 < TotalPages);
            }
        }
    }

ПРИМЕЧАНИЕ: я не хочу использовать какие-либо сторонние компоненты, такие как MVCContrib и т. д., так как это для университетского задания, так что это побеждает цель.

Теперь нумерация страниц работает нормально, но когда я выполняю поиск и, например, /? Query = test, я хочу иметь возможность просматривать результаты в тот момент, когда они теряются.Я предполагаю, что мне понадобится что-то вроде /? Query = test & page = 1

Спасибо.

1 Ответ

1 голос
/ 12 января 2011

Представленная вами строка запроса должна работать (попробуйте ее прямо в браузере, чтобы убедиться в этом).

У вас возникнет проблема, когда кто-то нажимает на навигационные ссылки, поскольку параметр query неучитывается в ваших Html.ActionLink звонках.Поскольку это домашнее задание, я оставлю это в качестве упражнения для читателя = p

Честно говоря, хотя.Вы должны быть в состоянии понять это оттуда.Если вы не прокомментируете, и я включу вас снова.

-cheers

update

Итак, вот какая у вас в данный момент следующая ссылка:

<%= Html.ActionLink("Next Page >>", "Index", new { page = (Model.PageIndex + 1) })%>

Вам нужно добавить запрос в качестве другого параметра в ActionLink.Однако, прежде чем сделать это, вам нужно захватить строку запроса где-нибудь в вашей модели.Грязный способ сделать это - добавить значение запроса в ViewData и передать его таким образом;чистый способ - добавить переменную в ваш класс paginatedList для хранения текущего запроса и установить его в модели.то есть

ViewData["query"] = query;

Или если вы выберете модельный маршрут:

paginatedList.Query = query;

Тогда вы можете сделать что-то вроде следующего:

<%= Html.ActionLink("Next Page >>", "Index", new { Page = (Model.PageIndex + 1), query = ViewData["query"] /*or Model.Query */  })%>

Я не уверенкак вы переустанавливаете свою маршрутизацию, но что-то похожее на вышесказанное должно работать.Вы также можете кэшировать объект IQueryable или даже просто строковый запрос, но это совсем другой уровень абстракции.

...