我有一个网格,其中包含我需要能够翻阅的联系信息。
所有管道已经到位,最后一个细节。分页是通过简单的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
我该怎么做?
答案 0 :(得分:1)
以下是从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页的结果开始。