ASP.NET MVC 分页,保留当前查询参数

问题描述 投票:0回答:3

我有一个包含联系信息的网格,我需要能够对其进行翻页。

所有管道都已经就位,还有最后一个细节。分页是通过一个简单的 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

我该怎么做?

c# asp.net-mvc pagination
3个回答
1
投票

我昨天问了类似的问题。也许您想查看 在.net mvc中保存数据

以下是从 Steve Sanderson 的 book

复制的代码
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();
    }
}

0
投票

因此,您需要让页面链接将用户定向到相同的 URL,但具有不同的“页面”值。 最明显的方法是让呈现页面链接的代码从当前请求中获取查询字符串,修改“page”值,并使用修改后的字符串呈现链接。

或者,这是我采用的方法,您可以为“列表”页面定义一个新路线,其中包括任何分页和排序值。 这样它们就成为 URL 的一部分,而且也很容易在控制器中处理。

包含排序和分页值的示例可能如下所示:

routes.MapRoute(
    “列表”,
    "{controller}/List/{pageNumber}/{sortBy}/{sortOrder}/{pageSize}",
    新{操作=“列表”,sortBy =“Id”,sortOrder =“升序”,pageNumber = 1,pageSize = 10},
    新{ sortBy = @"[A-Za-z0-9+-]*", sortOrder = "Asc|Desc", pageNumber = @"\d{1,6}", pageSize = @"\d{1, 6}" });

显然,您的“列表”操作方法需要能够解释这些值并相应地处理数据。 这可能不是您真正想要的,但我只是想把它扔在那里。

旁白:我还编写了一个 [List] 操作过滤器属性,它从路由中获取这些值,并且(如果模型是一个集合)自动在 OnActionExecuted 中应用排序和分页。这样我所要做的就是检索数据并设置模型。


0
投票

我在会话中保留每个表单的搜索值。 在响应搜索或分页的方法中,我首先加载会话中的任何值,然后使用查询字符串或表单参数中的值覆盖它们(并在必要时设置会话值),具体取决于它是 get 还是 post 。 这样我就不必担心分页代码(包括搜索条件)——它只是使用已经存储的内容。 如果我想进行新的搜索,则搜索框中的值会发生变化,并使用筛选按钮执行搜索 - 从第 1 页的结果开始。

© www.soinside.com 2019 - 2024. All rights reserved.