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

时间:2009-09-16 02:15:55

标签: c# asp.net-mvc paging

我有一个网格,其中包含我需要能够翻阅的联系信息。

所有管道已经到位,最后一个细节。分页是通过简单的p Querystring参数完成的,例如www.myurl.com/grid?p=3将是第三页;存储库自动获取正确的数据,以及项目的总数。每个页面的大小都在其他地方定义,我不需要在查询字符串中担心。

但是,我也支持搜索等。在我的Querystring中搜索的搜索词表示为q。所以现在我可以有一个组合:www.myurl.com/grid?q = tom& p = 2搜索“tom”并拉出第二页结果。

我现在遇到的问题,因为q(或其他)参数可能出现在查询字符串中,如何为此创建一个寻呼机(需要 keep < / em>原始参数,所以如果我点击“第2页”,它需要从

开始
  • www.myurl.com/grid?a=1&b=xyz&q=tom

  • www.myurl.com/grid?a=1&b=xyz&q=tom&p=2

我该怎么做?

3 个答案:

答案 0 :(得分:1)

我昨天问了一个类似的问题。也许你想看看 Preserve data in .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();
    }
}

答案 1 :(得分:0)

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

或者,这是我采用的方法,您可以为“列表”页面定义新路由,其中​​包括任何分页和排序值。这样它们就是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}" });

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

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

答案 2 :(得分:0)

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