Пытаться

аюсь собрать очень простое приложение с использованием ASP.NET 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 Я хочу иметь возможность публиковать результаты, в тот момент, когда они теряются: /

Благодарю.

 Cameron11 янв. 2011 г., 23:01
любые обновления, спасибо.
 John Farrell12 янв. 2011 г., 00:10
Погуглил CHT2520 потому что был подозрительным. Только результаты выглядят как расписания школьных занятий. Похоже, у кого-то есть домашнее задание завтра?
 Omu11 янв. 2011 г., 22:25
только что ответил что-то похожее:stackoverflow.com/questions/4659978/...
 Cameron12 янв. 2011 г., 00:45
Также добавлен тег (домашнее задание) к заголовку :)
 Cameron12 янв. 2011 г., 00:35
Я не уверен, что это имеет отношение к чему-либо? Плюс это не должно быть завтра! :) Кстати, я нашел решение, смотрите обновленный ответ, но у меня есть вторая проблема в том, что запрос теряется при навигации по страницам. Любые идеи, как это исправить. Благодарю.

Ответы на вопрос(1)

Решение Вопроса

в чем заключается ваша ошибка, но я думаю, что вижу, что не так:

Эти две строки вернут ваш IEnumerable, содержащий ваши результаты.

var paginatedArticles = OrderedArticles.Skip((page ?? 0) * pageSize).Take(pageSize).ToList();

return View(paginatedArticles);

Однако, основываясь на вашем взгляде и классе помощника, который вы разместили, вы ожидаете, что ваш взглядPaginatedList объект как его модель.

Если это так, я бы сделал следующее (обновленный):

var paginatedArticles = new PaginatedList( OrderedArticles, page ?? 0, pageSize );

return View(paginatedArticles);

И тогда ваш взгляд должен иметь правильную модель, возвращаемую к нему.

Тем не менее, я не знаю, почему вы не используете слой репозитория, но если ваше приложение представляет собой только одну страницу, почти всегда хорошая идея иметь его на своем месте.

Обновить - вот что я думаю должна быть полная логика контроллера:

public ActionResult Index(String query, int? page)
{
    const int pageSize = 4;

    var ArticleQuery = from m in _db.ArticleSet select m;

    // Searching
    if (!string.IsNullOrEmpty(query))
    {
        ArticleQuery = ArticleQuery.Where(m => m.headline.Contains(query));
    }

    var OrderedArticles = ArticleQuery.OrderByDescending(m => m.posted);

    var paginatedArticles = new PaginatedList( OrderedArticles, page ?? 0, pageSize );
    // this will now be of type paginatedList. this class handles all of the paging for you, so no need to do that ahead of time

    return View(paginatedArticles);
}

В этом случае PaginatedList НЕ является помощником - это полноценный класс, который необходимо создать и передать в вашу модель. Помощник в строгом определении слова делается по-другому и, вероятно, не сработает в вашем случае здесь.

 Cameron11 янв. 2011 г., 23:16
Здравствуй. Спасибо за ответ. Я не использую репо. Что мне нужно, так это изменить класс Helper для работы с моим контроллером, как он был изначально написан для репозитория, который я не использую в этом случае. Не могли бы вы помочь мне переписать его на работу. Большое спасибо.
 TheRightChoyce11 янв. 2011 г., 23:21
Ничто из того, что я написал, не нуждается в каком-либо репозитории, все может идти прямо в вашем контроллере. В этом случае вы проходитеOrderedArticles в конструктор вашегоPaginatedList класс. Мне кажется, что это класс, который вы должны возвращать в свое представление, чтобы вы могли получить доступ к параметрам следующей / предыдущей страницы и тому подобное. Я вижу одну вещь, которую я пропустил, я обновлю свой ответ.
 Cameron12 янв. 2011 г., 00:04
Переместил PaginatedList в мою папку Models, которая исправляет проблемы с View. Но я получаю эту ошибку в моем контроллере: Ошибка 5 При использовании универсального типа 'CHT2520_u0558234_1a.Models.PaginatedList <T>' требуются аргументы типа "1" C: \ Users \ cameron \ Desktop \ NON-REPOS \ CHT2520-u0558234-1a \ Контроллеры \ HomeController.cs 35 41 CHT2520-u0558234-1a
 Cameron11 янв. 2011 г., 23:18
Кроме того, если я не принесу заказанные статьи, то они больше не будут заказаны, не так ли?
 TheRightChoyce12 янв. 2011 г., 00:07
Пытатьсяvar paginatedArticles = new PaginatedList<ArticleSet>(OrderedArticles, page ?? 0, pageSize );

Ваш ответ на вопрос