18

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/sorting-filtering-and-paging-with-theの例を使用して、単純なページ リスト インデックスを実装しています。 -entity-framework-in-asp-net-mvc-application

私の問題は、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 です。

ロビー

4

4 に答える 4

23

問題は、PagedList エントリに並べ替え順序も現在のフィルターも含まれていないことです。

Vasanth の提案に従って ViewBag.CurrentSort を追加するだけでなく、PagedListPager を次のように変更する必要があります。

@Html.PagedListPager( Model, page => Url.Action("Index", new { page, currentFilter=ViewBag.CurrentFilter, sortOrder = ViewBag.sortOrder}) )
于 2013-09-11T10:56:06.457 に答える
2

こんにちは、私はこれを理解しました。Tempdata を使用して検索パラメーターを保持します。検索メソッドがいくつかの値で呼び出された場合、その値を tempdata に保存します。ページ リストがページ 2 のメソッドを呼び出すときに、TempData から Search パラメーターを収集します。

これを参照してください:

            if (SearchParameter != null)
            {
                TempData["HoldSearch"] = SearchParameter;
                TempData.Keep();
            }
            else
            {
                SearchParameter  = (CastBacktoType)TempData["HoldSearch"];
                TempData.Keep();
            }

これを試してみましたが、うまくいきます

于 2016-11-08T14:43:25.930 に答える
2

複数のフィールドを持つ複雑な検索/フィルタリング セクションがある場合は、次のようなものを使用する必要がある場合があります。

<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>

これは私にとってはうまくいき、複雑なフィルタリングを使用して複数のページで結果を表示できるようになりました.

于 2017-01-06T10:58:30.867 に答える