1

asp.net MVC で ViewModel を使用して pagedlist を実装する正しい方法を見つけようとしています。

次の 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はどのように見えるべきですか?

4

3 に答える 3

3

答えの組み合わせを使用して、これを非常にうまく機能させました。

    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; }       
}
于 2012-12-11T08:02:15.980 に答える
2

私はそれを次のように単純化します:

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,  
                       };
于 2012-12-10T15:44:53.950 に答える
2

データを取得する呼び出しを変更して、ページパラメータを含め、データベースでフィルタリングを実行する必要があります。このようにして、データベースから必要なデータのみを返します。

var clients = GetClients(page);

また、返されたクライアントをループしたくない場合(ここではループする必要がないようです)、返されたリストをViewModelに直接設定するだけです。このようなものが機能します。model.Clients適切に入力されるように、ViewModelを更新してください。

var clients = GetClients(page);

model.Clients = clients;
于 2012-12-10T14:55:19.680 に答える