PagedList在第二页时丢失搜索过滤器

18

我正在使用http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/sorting-filtering-and-paging-with-the-entity-framework-in-an-asp-net-mvc-application上的示例来实现一个简单的分页列表索引。

我的问题是,当我跳转到第二页时,搜索字符串就会“丢失”,所以我看到的是所有记录而不是经过筛选的结果。

我的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));

    }

例如当我前往第二页时,所有变量,包括sortOrder、currentFilter和searchString都为空。

Robbie


1
我没有看到在控制器操作中设置ViewBag.CurrentSort的代码。尝试添加它:ViewBag.CurrentSort = sortOrder; - Vasanth
1
搜索字符串的值是否被提交回文本框?如果没有,那么您需要确保在搜索后将其传回视图。 - Botonomous
1
它确实可以,但只对第一篇帖子有效,当我跳转到下一页时似乎没有被回传。 - Robbie Mills
1
你的CSHTML中的分页器长什么样子? - Evonet
4个回答

23

问题在于您的PagedList条目中没有包括排序顺序和当前筛选器。

除了按照Vasanth的建议添加ViewBag.CurrentSort之外,您还需要将PagedListPager更改为:

@Html.PagedListPager( Model, page => Url.Action("Index", new { page, currentFilter=ViewBag.CurrentFilter, sortOrder = ViewBag.sortOrder}) )

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>

这对我很有用,现在我可以使用复杂的过滤器并在多个页面上查看结果。


2

你好,我已经找到了解决方法。使用Tempdata来保存搜索参数。当调用搜索方法并传入一些值时,将这些值存储在Tempdata中。当页面列表调用第二页的方法时,从Tempdata中收集搜索参数。

参考如下:

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

尝试过这个,它的效果很好


0

如果我们想要通过应用多个过滤器来过滤数据,我们可以在视图中使用 ViewBag 来实现。

例如,如果我们想要为三个字段(即 EmpFirstName、EmpLastName 和 EmpLocation)应用过滤器。

@Html.PagedListPager(Model, page => Url.Action("Index", new { 
                           page,
                           sortOrder = ViewBag.sortOrder,
                           currentFilter1 =ViewBag.CurrentFilterForEmpFirstName,
                           currentFilter2 =ViewBag.CurrentFilterForEmpLastName,
                           currentFilter3 =ViewBag.CurrentFilterForEmpLocation}))

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

在控制器中,我编写了以下代码:
public ActionResult Index( int ?page, string currentFilter1, string currentFilter2, string currentFilter3,
 string searchEmpFirstName , string searchEmpLastName, string searchEmpLocation)

int pageSize = 10;
int pageNumber = (page??1);

var emp_master = db.Emp_Master.Include(l => l.Emp_Location);
   if (searchEmpFirstName != null || searchEmpLastName != null || searchEmpLocation != null)
   {
      page = 1;
   }
   else
   {
      searchEmpFirstName = currentFilter1;
      searchEmpLastName = currentFilter2;
      searchEmpLocation = currentFilter3;
   }

   ViewBag.CurrentFilterForEmpFirstName = searchEmpFirstName;
   ViewBag.CurrentFilterForEmpLastName = searchEmpLastName;
   ViewBag.CurrentFilterForEmpLocation = searchEmpLocation;

  if(!String.IsNullOrEmpty(searchEmpFirstName))
  {
      emp = emp.Where(s => s.ModelName == searchEmpFirstName)
  }
  if(!String.IsNullOrEmpty(searchEmpLastName))
  {
      emp = emp.Where(s => s.ModelName == searchEmpLastName)
  }
  if(!String.IsNullOrEmpty(searchEmpLocation))
  {
      emp = emp.Where(s => s.ModelName == searchEmpLocation)
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接