Попытка пейджинга с ViewModel в MVC4

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

Например, я хочу получить 20 элементов на странице, но я не понимаю, когда мне следует преобразовать мою модель в модель представления?

Это метод

public ViewResult Index(ProductReviewRelationalFilterViewModel filterViewModel)
{
    var items =
        _productreviewService.GetItems(filterViewModel.ProductId, filterViewModel.UserId)
                             .Select(AutoMapper.Mapper.Map<ProductReviewListViewModel>);

    var result = items.ToPagedList(filterViewModel.PageIndex, 20);

    return View(result );
}

Этот метод получает все элементы, затем преобразует их в ProductReviewListViewModel, а затем создает для него пейджинг.

Я хочу получить только 20 элементов из базы данных и получить тот же результат, что и выше?

Примечание. Метод GetItems возвращает IQueryable.

ДОБАВЛЕНИЕ РЕШЕНИЯ

Я сделал метод GetItems, а также вернул общее количество элементов как параметр int. В действии контроллера я использую метод StaticPagedList для создания пейджинга вручную, например эта ссылка говорит


person Barış Velioğlu    schedule 27.06.2013    source источник


Ответы (2)


Я не тестировал нижеследующее, но что-то на это влияет:

public ViewResult Index(ProductReviewRelationalFilterViewModel filterViewModel)
{
    var pageSize = 20;
    var skipRecords = (filterViewModel.PageIndex > 1 ? (filterViewModel.PageIndex - 1) * pageSize + (filterViewModel.PageIndex - 2) : 0);
    var items =
        _productreviewService.GetItems(filterViewModel.ProductId, filterViewModel.UserId)
                            .Skip(skipRecords).Take(pageSize)
                            .Select(AutoMapper.Mapper.Map<ProductReviewListViewModel>);

    var result = items.ToPagedList(filterViewModel.PageIndex, 20);

    return View(result );
}

Формула: (pageIndex > 1 ? (pageIndex - 1) * pageSize + (pageIndex - 2) : 0)

page 1 = 0 = skip 0 take 20
page 2 = (2 - 1) 1 * 20 + (2 - 2) 0 = skip 20 take 20
page 3 = (3 - 1) 2 * 20 + (3 - 2) 1 = skip 41 take 20
page 4 = (4 - 1) 3 * 20 + (4 - 2) 2 = skip 62 take 20 
page 5 = (5 - 1) 4 * 20 + (5 - 2) 3 = skip 83 take 20 

Results:
page 1 - skip 0 take 20 (shows record 0 - 20)
page 2 - skip 20 take 20 (shows record 21 - 41)
page 3 - skip 41 take 20 (shows record 42 - 62)
page 4 - skip 62 take 20 (shows record 63 - 83)

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

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

person JonVD    schedule 27.06.2013

У вас есть несколько вариантов, например использование Jquery или Angular.js, или вы можете использовать этот пример

Хотя я использую этот простой код для своего проекта, и он отлично работает:

tblNews.Skip((PageIndex * CountPerPage) - CountPerPage).Take(CountPerPage).ToList()
person Aref Bozorgmehr    schedule 10.11.2019