【问题标题】:ASP.NET MVC Paging, Preserving Current Query ParametersASP.NET MVC 分页,保留当前查询参数
【发布时间】:2010-11-28 16:07:22
【问题描述】:

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

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

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

我现在面临的问题,由于 q(或其他)参数可能出现在查询字符串中,我该如何为此创建一个寻呼机(这需要 keep 原始参数,所以如果我点击“第 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 paging


    【解决方案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();
        }
    }
    

    【讨论】:

    • 您的问题很相似,但与我希望参数保持可见(作为整个查询字符串的一部分,而不是隐藏字段的一部分)不同,以便人们可以为第 5 页添加书签例如搜索查询。
    • 我通过向 Html.PageLink 调用添加一些参数来试验我的观点。 Url.Action(MVC.Merchandise.Actions.List, new { category=ViewData["CurrentCategory "], page = x, price = 3, weight = 2}))%> 我的结果 url 从 myurl/Merchandise/5 更改为 myurl/Merchandise/5/?price=3&weight=2 这是你想要的吗?
    • 如果您也希望 page=5,您应该转到 Global.ascx.cs 并将您的路线映射从“Grid/{page}”更改为“Grid”。
    • 哪里有 Html.PageLink 扩展方法?您能否将示例代码添加到您的答案中?
    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

    • 你将如何创建一个使用这种结构的寻呼机?您可以发布一个代码示例吗?
    • 嗯,基本上你现在拥有的所有信息都是一样的,但它们都在你的路线数据中而不是你的查询字符串中可用。但是,我假设这种方法需要对您的代码进行重大更改。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多