尝试在分页内部传递过滤器变量

时间:2019-05-14 19:29:49

标签: c# asp.net-mvc-5 pagedlist

我有一个称为重新排序的视图。这是一个列表视图,基本上显示了所有可用的耗材。该列表太长,以至于我们必须实现分页,以便页面加载而不会超时。效果很好。

我们还有一个过滤器(文本框),用户可以在其中输入数字,并过滤列表以仅查看库存等于或小于所需数量的耗材。从理论上讲,使用上面提到的过滤器可以很好地工作。

问题是-当用户选择移动到结果的第一页之外时,过滤器将保留在原处,但是库存数量下降,所有库存(无论库存量如何)都开始显示。

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

这是我的重新排序控制器代码

    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等于或小于该值的情况下带回结果。 searcstring最终收敛到searchvalue。

我应该在此行中的某处添加searchvalue吗?

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

2 个答案:

答案 0 :(得分:1)

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

这是我在工作的控制器

SELECT PARTITION_NAME, SUBPARTITION_NAME, HIGH_VALUE FROM ALL_TAB_SUBPARTITIONS WHERE TABLE_OWNER = 'SYS'    AND TABLE_NAME = 'fubar'

以及视图中的相关代码:

{

        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>

答案 1 :(得分:1)

也许不能以此回答您的问题,但是为了提高性能,您应该将.ToList()方法移到代码的后面。阅读more here,了解如何使用Linq进行有效的分页。在.ToList()方法之前,还要添加搜索值。否则,Linq的力量再次被击败。

用第一行将您的searchValue条款附在后面:

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

然后将已编辑的行移至ViewBag.searchString = searchValue行下方。

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