【问题标题】:Trying to pass filter variables inside of pagination试图在分页内传递过滤器变量
【发布时间】:2019-05-14 19:29:49
【问题描述】:

我有一个名为 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 等于或小于该值的结果。 searcstring 最终被转换为 searchvalue。

我应该在这一行的某处添加 searchvalue 吗?

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

【问题讨论】:

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


    【解决方案1】:

    我已经解决了我的问题,方法是使用 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));
    
        }
    

    以及View中的相关代码:

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

    【讨论】:

      【解决方案2】:

      也许不能用这个来回答你的问题,但为了性能起见,你应该将.ToList() 方法移到代码的后面一点。阅读morehere,了解使用 Linq 进行高效分页。在.ToList() 方法之前,还要添加您的搜索值。否则 Linq 的力量又被打败了。

      将您的 searchValue where 子句与您的第一行链接起来:

      var supplies = db.ICS_Supplies.Where(s =&gt; s.OnHand &lt; searchValue).OrderByDescending(g =&gt; g.Supplies_ID).ToList();

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

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

      【讨论】:

      • 感谢您抽出宝贵时间提供一些有用的信息。我正处于学习 MVC5、C#、Linq(以及 Jscript 和 Jquery)的初级阶段。这是一个巨大的学习曲线,我感谢您提供帮助的建议。我将查看链接并进行适当的更改。谢谢!
      猜你喜欢
      • 1970-01-01
      • 2021-09-23
      • 2021-03-09
      • 2013-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-14
      相关资源
      最近更新 更多