试图在分页中传递过滤器变量
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
行下方。
事实上,你应该重写更多这段代码,但没有足够的时间提供一个好的例子,你最好阅读上面提到的两个链接。关键是你应该对数据库进行分页和过滤。
我有一个名为 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
行下方。
事实上,你应该重写更多这段代码,但没有足够的时间提供一个好的例子,你最好阅读上面提到的两个链接。关键是你应该对数据库进行分页和过滤。