ASP.NET X.PagedList分页跳转时如何自动复用全部查询字符串参数
实现方案
不需要手动逐个枚举传递查询参数,直接复用当前请求的查询集合构造路由值即可,后续新增、修改筛选条件时也不用调整分页相关代码。
基础写法
ASP.NET Core 版本
直接在PagedListPager的URL生成委托中,通过RouteValueDictionary自动加载当前所有查询参数,仅替换分页需要的页码参数:
@Html.PagedListPager(Model, page => { // 自动导入当前请求的全部查询字符串 var routeValues = new RouteValueDictionary(Context.Request.Query); // 设置目标分页页码 routeValues["page"] = page; return Url.Action("query", routeValues); })
传统 ASP.NET MVC(非Core)版本
传统MVC的Request.Query是NameValueCollection类型,先转成字典再构造路由值即可:
@Html.PagedListPager(Model, page => { var queryDic = Request.QueryString.AllKeys.ToDictionary(k => k, k => (object)Request.Query[k]); var routeValues = new RouteValueDictionary(queryDic); routeValues["page"] = page; return Url.Action("query", routeValues); })
复用封装
如果项目里有多个页面用到分页,可以把这个逻辑封装成UrlHelper扩展方法,避免重复写字典构造代码:
public static class PagerExtentions { public static string PagedQueryUrl(this IUrlHelper url, string actionName, int targetPage, object extraParams = null) { var routeValues = new RouteValueDictionary(url.ActionContext.HttpContext.Request.Query); routeValues["page"] = targetPage; // 支持合并额外传入的路由参数 if (extraParams != null) { foreach (var kv in new RouteValueDictionary(extraParams)) { routeValues[kv.Key] = kv.Value; } } return url.Action(actionName, routeValues); } }
封装后视图里的分页代码可以简化成一行:
@Html.PagedListPager(Model, page => Url.PagedQueryUrl("query", page))
补充说明:
- 如果你的分页参数名不是默认的
page,修改字典中对应的键名即可- 如果有不需要保留的查询参数,构造完路由字典后调用
routeValues.Remove("参数名")即可排除
内容的提问来源于stack exchange,提问作者Grazosi
相关产品推荐
相关产品推荐

