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

Asp.Net Core迁移报错:无法将QueryString转换为IEqualityComparer

Asp.Net Core迁移:QueryString转换报错的解决方案

我一眼就看出问题所在了——Asp.Net Core里的QueryString类型和你之前用的Asp.Net MVC版本完全不是一回事儿!Core中的QueryString是一个轻量结构体,只负责存储原始的查询字符串(比如?key=val这种格式),根本不是集合类型,所以你直接把它传给NameValueCollection的构造函数肯定会报错。

别担心,我给你调整一下代码,适配Asp.Net Core的写法:

修改后的完整代码

void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
{
    var req = filterContext.HttpContext.Request;
    // 直接使用Request.Query,它本身就是IQueryCollection类型,无需转NameValueCollection
    var queryParams = req.Query;
    string param = string.Empty; // 补上原代码中缺失的变量定义

    foreach (string key in queryParams.Keys)
    {
        if (controllerName.Equals("Company") && queryParams.Count > 1)
        {
            if (key.Equals("typ"))
            {
                if (!string.IsNullOrEmpty(param))
                    param += "&";
                param += $"{key}={queryParams[key]}";
                break;
            }
        }
        // 调整判断逻辑,匹配原代码中排除"q"参数的意图
        if (!string.IsNullOrEmpty(param) && !key.Equals("q"))
        {
            if (!string.IsNullOrEmpty(param))
                param += "&";
            param += $"{key}={queryParams[key]}";
        }
    }

    base.OnActionExecuting(filterContext);
}

关键变化说明

  • 去掉了NameValueCollection的转换,直接使用req.Query(类型为IQueryCollection),它已经是键值对集合,可以直接遍历键集合queryParams.Keys
  • 原来的queryStringParams.AllKeys.Length替换为queryParams.Count,更符合Core的API风格
  • 用字符串插值$"{key}={queryParams[key]}"替代拼接,代码更简洁易读
  • 补上了原代码中缺失的param变量定义(否则编译也会报错)

如果想要更安全的取值方式(避免键不存在引发异常),可以改用queryParams.TryGetValue(key, out var value)来获取参数值,能有效规避潜在的KeyNotFoundException。

内容的提问来源于stack exchange,提问作者Afaq Rajput

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:00:17