Реализация модели представления PagedList

Я пытаюсь выяснить, как правильно реализовать список страниц с ViewModel в asp.net MVC.

Скажем, у меня есть следующая PagedClientViewModel:

public class PagedClientViewModel
{
    public PagedList.IPagedList<ClientViewModel> Clients { get; set; }
}

public class ClientViewModel
{
    public string ClientNumber { get; set; }
    public string ClientName { get; set; }       
}

Мое представление будет ссылаться на модель следующим образом:

@model PagedClientViewModel

и метод действия выглядит примерно так:

    public ActionResult Index(int? page)
    {
        var pageNumber = page ?? 1;

        var clients = GetAllClients();

        var onePageOfClients = clients.ToPagedList(pageNumber, 25);

        PagedClientViewModel model = new PagedClientViewModel();

        var clientViewModels = new List<ClientViewModel>();

        foreach (var client in clients)
        {
            ClientViewModel clientVM = new ClientViewModel
            {
                ClientName = client.CLIENTNAME,
                ClientNumber = client.CLIENTNO,         
            };
            clientViewModels.Add(clientVM);
        }                    

        model.Clients = //how do I add the clientViewModels to the PagedList<ClientViewModel>?

        return View(model);
    }

Я не хочу перебирать весь список клиентских записей из базы данных при создании моделей представления — не усложняю ли я ситуацию, имея модель представления, содержащую список страниц? Я не хочу использовать ViewBag!

Как должна выглядеть моя ViewModel?


person woggles    schedule 10.12.2012    source источник


Ответы (3)


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

var clients = GetClients(page);

Кроме того, если вы не хотите зацикливаться на своих возвращенных клиентах (что, похоже, вам здесь не нужно), просто установите возвращаемый список непосредственно в вашу ViewModel. Что-то вроде этого сработает. Убедитесь, что вы обновили ViewModel, чтобы model.Clients был введен правильно.

var clients = GetClients(page);

model.Clients = clients;
person Rick B    schedule 10.12.2012

Получил это, чтобы работать довольно хорошо, используя комбинацию ответов:

    public ActionResult Index(PagedClientViewModel model)
    {
        var pageIndex = model.Page ?? 1;
        var clients = from client in GetAllClients() orderby client.CLIENTNUMBER
                      select new ClientViewModel
                          {
                              ClientName = client.CLIENTNAME,
                              ClientNumber = client.CLIENTNO

                          };        

        model.Clients = clients.ToPagedList(pageIndex, 25);

        return View(model);
    }


public class PagedClientViewModel
{
    public int? Page { get; set; }
    public PagedList.IPagedList<ClientViewModel> Clients { get; set; }
}

public class ClientViewModel
{
    public string ClientNumber { get; set; }
    public string ClientName { get; set; }       
}
person woggles    schedule 11.12.2012

Я бы упростил это до sth следующим образом:

public IEnumerable<ClientViewModel> Clients { get; set; }

а также

model.Clients = from client in GetAllClients().Skip(pageNumber * PageSize).Take(PageSize)
                       select new ClientViewModel
                       {
                           ClientName = client.CLIENTNAME,
                           ClientNumber = client.CLIENTNO,  
                       };
person free4ride    schedule 10.12.2012