You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 08:03:28