我有一个称为重新排序的视图。这是一个列表视图,基本上显示了所有可用的耗材。该列表太长,以至于我们必须实现分页,以便页面加载而不会超时。效果很好。
我们还有一个过滤器(文本框),用户可以在其中输入数字,并过滤列表以仅查看库存等于或小于所需数量的耗材。从理论上讲,使用上面提到的过滤器可以很好地工作。
问题是-当用户选择移动到结果的第一页之外时,过滤器将保留在原处,但是库存数量下降,所有库存(无论库存量如何)都开始显示。
我尝试了几种不同的方法,但无法弄清楚在分页代码中添加搜索字符串的位置,因为它可以传递到用户跳转到的任何页面。
这是我的重新排序控制器代码
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));
答案 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
行下方。
实际上,您应该重写更多此类代码,但是如果没有足够的时间来提供一个很好的示例,则最好阅读上面提到的两个链接。关键是您应该对数据库进行分页和过滤。