试图在分页中传递过滤器变量

Trying to pass filter variables inside of pagination

我有一个名为 Reorder 的视图。这是一个列表视图,基本上显示了所有可用的用品。列表太长了,我们必须实现分页,这样页面才能加载而不会超时。效果很好。

我们还有一个过滤器(文本框),用户可以在其中输入一个数字,然后过滤列表以仅查看库存等于或少于所需数量的用品。理论上,上面提到的过滤器可以正常工作。

问题在于 - 当用户选择超出第一页结果时,过滤器仍然存在,但库存数量会下降,所有供应品,无论库存数量如何,都会重新开始显示。

我尝试了几种不同的方法,但无法弄清楚在分页代码中的何处添加搜索字符串,以便它可以传递到用户跳转到的任何页面。

这是我的再订购控制器代码

    public ActionResult Reorder(string searchString, int? page)
    {

    var supplies = db.ICS_Supplies.OrderByDescending(g => g.Supplies_ID).ToList();


    int searchValue;

    // If searchString is null (or not an int), then set our searchValue to int.MaxValue
    if (!int.TryParse(searchString, out searchValue)) searchValue = int.MaxValue;

    // var catalogs = supplies.Where(s => s.OnHand.HasValue && s.OnHand.Value <= searchValue);
    var catalogs = supplies.Where(s => s.OnHand < searchValue);

    var pageNumber = page ?? 1;
    return View(catalogs.ToPagedList(pageNumber, 10));

    }

搜索字符串从视图传递到控制器,用于返回 OnHand 等于或小于该值的结果。 searchstring 最终会转换为 searchvalue。

我应该在这一行的某处添加搜索值吗?

var pageNumber = page ?? 1;
    return View(catalogs.ToPagedList(pageNumber, 10));

我已经通过使用 Viewbag 在 @HtmlActionLink 中传递变量解决了我的问题,因此在每个页面更改时都包含过滤器。之前,我通过@HtmlActionLink 发送了一个未过滤的模型,这就是它失败的原因。

这是我的工作控制器

{

        var supplies = db.ICS_Supplies.OrderByDescending(g => g.Supplies_ID).ToList();

        int searchValue;

        // If searchString is null (or not an int), then set our searchValue to int.MaxValue
        if (!int.TryParse(searchString, out searchValue)) searchValue = int.MaxValue;

        // Set Viewbag for filter

        ViewBag.searchString = searchValue;

        var catalogs = supplies.Where(s => s.OnHand < searchValue);

        var pageNumber = page ?? 1;
       // return View(catalogs = supplies.Where(s => s.OnHand < searchValue).ToPagedList(pageNumber, 10));
        return View(catalogs.ToPagedList(pageNumber, 10));

    }

以及视图中的相关代码:

<form asp-controller="Movies" asp-action="Index">
<p>
    Stock Inventory Less Than: <input type="text" name="searchString">
    <input type="submit" value="Filter" />

</p>

@Html.PagedListPager(Model, page => Url.Action("Reorder", new { page, searchString = ViewBag.searchString }))

也许这不能回答您的问题,但为了性能起见,您应该将 .ToList() 方法移至代码中的稍后位置。阅读 more here 关于使用 Linq 进行高效分页的内容。在 .ToList() 方法之前,还要添加您的搜索值。不然Linq的力量又被打败了。

将您的搜索值 where-clause 与您的第一行联系起来:

var supplies = db.ICS_Supplies.Where(s => s.OnHand < searchValue).OrderByDescending(g => g.Supplies_ID).ToList();

并将编辑的行移至 ViewBag.searchString = searchValue 行下方。

事实上,你应该重写更多这段代码,但没有足够的时间提供一个好的例子,你最好阅读上面提到的两个链接。关键是你应该对数据库进行分页和过滤。