试图通过分页的内部过滤器变量



i有一个称为重新排序的视图。这是一个列表视图,基本上显示了所有可用的耗材。列表非常长,我们必须实施分页,以便页面可以加载而无需过时。效果很好。

我们还有一个过滤器(文本框(,用户可以输入一个数字,并过滤列表以查看其库存相等或低于所需金额的供应。从理论上讲,它可以与上述过滤器一起使用。

问题是 - 当用户选择超出结果的第一页时,过滤器仍保持到位,但是库存号码被删除,所有供应量,无论库存金额均可再次出现。

我尝试了几种不同的方法,但无法弄清楚在分页代码中添加搜索串的位置,以便将其延伸到用户跳转的任何页面。

这是我的重新订购控制器代码

    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));
    }

搜索串从视图传递到控制器,并用于带回术中相等或小于该值的结果。Searcstring最终将转换为搜索值。

我应该在此行中的某个地方添加搜索值吗?

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()方法移动到代码的以后点。在此处阅读有关使用LINQ有效分页的更多信息。在使用.ToList()方法之前,还要添加您的搜索值。否则Linq的力量再次被击败。

将您的搜索值链接到您的第一行的范围:

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

移动在ViewBag.searchString = searchValue线下方的编辑线。

实际上,您应该重写更多此代码,但是如果没有足够的时间来提供一个很好的例子,最好阅读上面提到的两个链接。关键是您应该在数据库上进行分页和过滤。

最新更新