ASP.Net MVC Paging возвращает один большой набор результатов вместо разделения набора результатов на страницы.

Я использую пейджинг в своем представлении, и изначально моя @модель имела тип PagedList.IPagedList, но у меня были проблемы с отправкой интерфейса IPagedList обратно в контроллер, поэтому я нашел сообщение, в котором давался совет о том, как деконструировать мой IPagedList, поэтому я может представить его в представлении и также иметь возможность отправлять обратно в контроллер для дальнейшей обработки. Однако я столкнулся со следующей проблемой: я хочу отображать только 50 записей на каждой странице. Критерии поиска, которые я тестирую, возвращают 13000 записей. Я ожидаю только 50 записей на первой странице с номерами страниц 1,2,3 внизу. Я вижу номера страниц, как и ожидалось, внизу, но все 13000 записей отображаются на каждой странице. Я отладил код и обнаружил, что функция StaticPagedList возвращает 13000 записей вместо 50, поэтому я применил Skip and Take к объекту, прежде чем возвращать его в представление, но проблема все еще возникает. Мой код: Просмотр моделей -

    public class PagedClientViewModel
{
    public int? Page { get; set; }
    public IEnumerable<SelectTimeTrackerEditorViewModel> Clients { get; set; }
    public IPagedList PagingMetaData { get; set; }
}

public class SelectTimeTrackerEditorViewModel
{
    public bool Selected { get; set; }
    public int SID { get; set; }
    public string PerNo { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

Вид -

@model EmergencyResponseTimeEntry.Models.PagedClientViewModel

@использование PagedList; @использование PagedList.Mvc;

        @foreach (var item in Model.Clients)
        {
            <tr>
                <td>
                    @Html.CheckBoxFor(modelItem => item.Selected)
                </td>

                <td>
                    @Html.DisplayFor(modelItem => item.PerNo)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.FirstName)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.LastName)
                </td>
            </tr>
        }
    
        
        Page @(Model.PagingMetaData.PageCount < Model.PagingMetaData.PageNumber ? 0 : Model.PagingMetaData.PageNumber) of @Model.PagingMetaData.PageCount
        @Html.PagedListPager(new StaticPagedList<EmergencyResponseTimeEntry.Models.SelectTimeTrackerEditorViewModel>(Model.Clients, Model.PagingMetaData), page => Url.Action("Index", new { page }), new PagedListRenderOptions { DisplayEllipsesWhenNotShowingAllPageNumbers = false})

Контроллер -

var list = (from c in timeTrackers

                                    select new SelectTimeTrackerEditorViewModel
                                        { 
                                            Selected = false,
                                            SID = c.SID,
                                            PerNo = c.PerNo,
                                            FirstName = c.FirstName,
                                            LastName = c.LastName
                                        });

        var pagedClientViewModel = new PagedClientViewModel
        {
            Clients = list
        };
       
        int pageSize = 50;
        int pageNumber = (page ?? 1);

        int totalClients = list.Count();

        // List of current page of 50 records (hits database again, pulls only 50 records, though)
        var timeTrackerList = list.Skip((pageNumber - 1) * pageSize).Take(pageSize).ToList();

        

        pagedClientViewModel.PagingMetaData = new StaticPagedList<SelectTimeTrackerEditorViewModel>
            (timeTrackerList, pageNumber, pageSize, totalClients).GetMetaData();

        return View(pagedClientViewModel);

person Natalya    schedule 01.07.2020    source источник


Ответы (1)


Я заработал после того, как коллега указал, что я отображаю все записи в своем представлении - Model.Clients. Итак, в моем контроллере я изменил это

var pagedClientViewModel = new PagedClientViewModel
        {
            Clients = list
        };

к этому -

var pagedClientViewModel = new PagedClientViewModel
        {
            Clients = list.Skip((pageNumber - 1) * pageSize).Take(pageSize).ToList()
        };

Теперь пейджинг работает как положено!

person Natalya    schedule 02.07.2020