3

これを理解しようとするのは長い一日でした.stackoverflowには常に答えがあると思います. 似たような投稿を検索しましたが、必死に探しているものはないと思います。これが取り引きです。私はこのMVC 4プロジェクトに取り組んでいますが、いくつかの問題に遭遇したため、それを開くきっかけになりました。MVC でページネーションにIPageListを使用するのは非常にクールですが、インデックスに同じActionResultコンテナーを使用してフィルター処理された結果をページングし続けるにはどうすればよいでしょうか。ここに食事をするためのコードがあります。

public ActionResult Index(int? page, int category = 0)
     {
         int pageSize = 10;
         int pageNumber = (page ?? 1);
         if (category != 0)
         {
             var products = (from p in db.Products where p.ProductID == category select p).OrderBy(x => x.ProductName).ToList();
             return View(products.ToPagedList(pageNumber, pageSize));
         }
         else
         {
             var products = (from p in db.Products select p).OrderBy(x => x.ProductName).ToList();
             return View(products.ToPagedList(pageNumber, pageSize));
         }
     }

基本的に、int カテゴリはドロップダウン リストから取得した値です。完全にフィルタリングされますが、問題は、フィルタリングして結果が10を超え、次のページに移動しようとすると、インデックスの初期結果に戻ることです。デバッグしてみると、次がクリックされると、 int カテゴリの値がクリアされ、else ブロックにステップインすることがわかりました。これがページングコントロールです。おそらく調整が必要なものがあります...

<div>Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber)
of @Model.PageCount

@if (Model.HasPreviousPage)
{
    @Html.ActionLink("<<", "Index", new { page = 1, sortOrder = ViewBag.CurrentSort, currentFilter=ViewBag.CurrentFilter  })
    @Html.Raw(" ");
    @Html.ActionLink("< Prev", "Index", new { page = Model.PageNumber - 1, sortOrder = ViewBag.CurrentSort, currentFilter=ViewBag.CurrentFilter  })
}
else
{
    @:<<
    @Html.Raw(" ");
    @:< Prev
}

@if (Model.HasNextPage)
{
    @Html.ActionLink("Next >", "Index", new { page = Model.PageNumber + 1, sortOrder = ViewBag.CurrentSort, currentFilter=ViewBag.CurrentFilter  })
    @Html.Raw(" ");
    @Html.ActionLink(">>", "Index", new { page = Model.PageCount, sortOrder = ViewBag.CurrentSort, currentFilter=ViewBag.CurrentFilter  })
}
else
{
    @:Next >
    @Html.Raw(" ")
    @:>>
}

私が必要としているのは、ページで返されたフィルタリングされた結果がページングに応答することです。私は答えを待ちます。ありがとう!

4

3 に答える 3

4

Suhasによる以前の回答とコメントの助けを借りて、より明確でより良い解決策を導き出すことができました。最終的な解決策は次のとおりです。

public ActionResult Index(int? page, int category = 0)
 {
     int pageSize = 10;
     int pageNumber = (page ?? 1);
     if (category != 0)
     {
         ViewBag.CurrentFilter = category;
         var products = (from p in db.Products where p.ProductID == category select p).OrderBy(x => x.ProductName).ToList();
         return View(products.ToPagedList(pageNumber, pageSize));
     }
     else
     {
         var products = (from p in db.Products select p).OrderBy(x => x.ProductName).ToList();
         return View(products.ToPagedList(pageNumber, pageSize));
     }
 }

それが他の人に役立つことを願っています。スハスは評価に値する。乾杯!

注意:このソリューションに関するSuhas のコメントは非常に重要です。

于 2012-11-09T01:09:39.227 に答える
1

ViewBag.CurrentFilter = category;CurrentFilterがカテゴリであると想定したアクションコンテナセット

于 2012-11-08T23:00:30.960 に答える