ASP.NET MVC 分页,保留当前查询参数
-
07-07-2019 - |
题
我有一个包含联系信息的网格,我需要能够对其进行翻页。
所有管道已经就位, ,还有最后一个细节。分页是通过一个简单的 p 查询字符串参数完成的,例如www.myurl.com/grid?p=3 将是第三页;存储库会自动获取正确的数据以及项目的总数。每个页面的大小是在其他地方定义的,我不需要在查询字符串中担心这一点。
不过,我支持搜索等。以及。搜索的搜索词在我的查询字符串中表示为 q 。所以现在我可以有一个组合:www.myurl.com/grid?q=tom&p=2 搜索“tom”并提取第二页结果。
我现在面临的问题,因为 q (或其他)参数 可能 出现在查询字符串中,如何为此创建一个寻呼机(这需要 保持 原始参数,所以如果我点击“第 2 页”,它需要从
www.myurl.com/grid?a=1&b=xyz&q=tom
到
www.myurl.com/grid?a=1&b=xyz&q=tom&p=2
我怎样才能做到这一点?
解决方案
我昨天问了类似的问题。也许您想查看在.net mvc 中保存数据
以下是从 Steve Sanderson 复制的代码 书
public static class PagingHelpers
{
public static string PageLinks(this HtmlHelper html, int currentPage,
int totalPages, Func<int, string> pageUrl)
{
StringBuilder result = new StringBuilder();
for (int i = 1; i <= totalPages; i++)
{
TagBuilder tag = new TagBuilder("a"); // Construct an <a> tag
tag.MergeAttribute("href", pageUrl(i));
tag.InnerHtml = i.ToString();
if (i == currentPage)
tag.AddCssClass("selected");
result.AppendLine(tag.ToString());
}
return result.ToString();
}
}
其他提示
因此,您需要让页面链接将用户引导至相同的 URL,但具有不同的“页面”值。最明显的方法是让呈现页面链接的代码从当前请求中获取查询字符串,修改“page”值,并使用修改后的字符串呈现链接。
或者,这就是我所采用的方法,您可以为“列表”页面定义一个新路线,其中包括任何分页和排序值。这样它们就成为 URL 的一部分,而且也很容易在控制器中处理。
包含排序和分页值的示例可能如下所示:
routes.MapRoute( "List", "{controller}/List/{pageNumber}/{sortBy}/{sortOrder}/{pageSize}", new { action = "List", sortBy = "Id", sortOrder = "Asc", pageNumber = 1, pageSize = 10 }, new { sortBy = @"[A-Za-z0-9+-]*", sortOrder = "Asc|Desc", pageNumber = @"\d{1,6}", pageSize = @"\d{1,6}" });
显然,您的“列表”操作方法需要能够解释这些值并相应地处理数据。这可能不是你真正想要的,但我只是想把它扔掉。
在旁边:我还编写了一个 [List] 操作过滤器属性,该属性从路由中获取这些值,并且(如果模型是集合)自动在 OnActionExecuted 中应用排序和分页。这样我所要做的就是检索数据并设置模型。
我在会话中保留每个表单的搜索值。在响应搜索或分页的方法中,我首先加载会话中的任何值,然后使用查询字符串或表单参数中的值覆盖它们(并在必要时设置会话值),具体取决于它是 get 还是 post 。这样我就不必担心分页代码(包括搜索条件)——它只是使用已经存储的内容。如果我想进行新的搜索,则搜索框中的值会发生变化,并使用过滤按钮执行搜索 - 从第 1 页的结果开始。