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
相关产品推荐
相关产品推荐

