私の問題は、2ページ目にページを移動すると検索文字列が「失われる」ため、フィルタリングされた結果のセットの代わりに、すべてのレコードが表示されることです。
私のindex.cshtml:
@using (Html.BeginForm("Index", "", FormMethod.Get))
{
<p>
@Html.TextBox("searchString", ViewBag.currentFilter as string, new { @placeholder = "Search by title or author" })
<input type="submit" value="Search" />
</p>
}
@if (Model.PageCount > 1)
{
@Html.PagedListPager( Model, page => Url.Action("Index", new { page }) )
}
私のコントローラー:
public ViewResult Index(string sortOrder, string currentFilter, string searchString, int? page)
{
ViewBag.TitleSortParm = sortOrder == "Title" ? "Title desc" : "Title";
ViewBag.AuthorSortParm = sortOrder == "Author" ? "Author desc" : "Author";
ViewBag.DateSortParm = sortOrder == "Date" ? "Date desc" : "Date";
if (searchString != null)
{
page = 1;
}
else
{
searchString = currentFilter;
}
ViewBag.currentFilter = searchString;
var Articles = from a in db.Articles
select a;
if (!String.IsNullOrEmpty(searchString))
{
//page = 1;
Insights = Articles.Where(s => s.Title.ToUpper().Contains(searchString.ToUpper())
|| s.Author.ToUpper().Contains(searchString.ToUpper()));
}
switch (sortOrder)
{
case "Author":
Insights = Articles.OrderBy(s => s.Author);
break;
case "Author desc":
Insights = Articles.OrderByDescending(s => s.Author);
break;
case "Title":
Insights = Articles.OrderBy(s => s.Title);
break;
case "Title desc":
Insights = Articles.OrderByDescending(s => s.Title);
break;
case "Date":
Insights = Articles.OrderBy(s => s.DatePublished);
break;
default:
Insights = Articles.OrderByDescending(s => s.DatePublished);
break;
}
int pageSize = 3;
int pageNumber = (page ?? 1);
return View(Articles.ToPagedList(pageNumber, pageSize));
}
例として2ページに移動すると、すべての変数、sortOrder、currentFilter、およびsearchStringがすべてnullになっています。
ロビー
問題は、PagedListエントリにソート順も現在のフィルターも含まれていないことです。
Vasanthによって提案されたようにViewBag.CurrentSortを追加することに加えて、PagedListPagerを次のように変更する必要もあります。
@Html.PagedListPager( Model, page => Url.Action("Index", new { page, currentFilter=ViewBag.CurrentFilter, sortOrder = ViewBag.sortOrder}) )
こんにちは私はこれを理解しました、検索パラメータを保持するためにTempdataを使用してください。検索メソッドがいくつかの値で呼び出された場合、その値を一時データに格納します。ページリストがページ2のメソッドを呼び出すとき、TempDataから検索パラメーターを収集します。
これを参照してください:
if (SearchParameter != null)
{
TempData["HoldSearch"] = SearchParameter;
TempData.Keep();
}
else
{
SearchParameter = (CastBacktoType)TempData["HoldSearch"];
TempData.Keep();
}
これを試しましたが、うまくいきます
複数のフィールドがある複雑な検索/フィルタリングセクションがある場合は、次のようなものを使用する必要があります。
<div class="pagedList">
@Html.PagedListPager(Model, page => Url.Action("Index", new {
page, sortOrder = ViewBag.CurrentSort,
currentFilter = ViewBag.CurrentFilter,
filter2= Request.QueryString["filter2"],
filter3= Request.QueryString["filter3"],
filter4= Request.QueryString["filter4"],
filter5= Request.QueryString["filter5"] }))
Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount
</div>
これは私にとってはうまくいき、今では複雑なフィルタリングを使用して、複数のページで結果を表示することができます。