ASP.NET MVC GET方法如何接收多个可选field=value格式查询参数
首先你需要修正路由定义:路由模板仅匹配URL中查询字符串(?)之前的路径部分,无需在路由中声明查询参数,调整后的路由如下:
[Route("v1/v2/v3")] public async Task<HttpResponseMessage> GetContent()
以下是两种在同一方法内判断并读取对应参数的实现方案:
方案1:显式声明所有可能的查询参数
由框架自动完成参数绑定,写法最简,适配参数固定的场景:
[Route("v1/v2/v3")] public async Task<HttpResponseMessage> GetContent(bool? isFormatSimple = null, string vers = null, bool? allow = null) { // 匹配第一种请求场景 if (isFormatSimple.HasValue) { bool formatVal = isFormatSimple.Value; // 执行对应逻辑 } // 匹配第二种请求场景 else if (!string.IsNullOrEmpty(vers) && allow.HasValue) { string versVal = vers; bool allowVal = allow.Value; // 执行对应逻辑 } // 其余业务逻辑 }
方案2:直接读取请求查询字典
无需修改方法签名即可适配后续新增的查询参数,灵活性更高:
.NET Core / .NET 5+ 版本实现:
[Route("v1/v2/v3")] public async Task<HttpResponseMessage> GetContent() { var query = Request.Query; if (query.ContainsKey("isFormatSimple")) { bool.TryParse(query["isFormatSimple"], out bool isFormatSimple); // 第一种场景逻辑处理 } else if (query.ContainsKey("vers") && query.ContainsKey("allow")) { string vers = query["vers"]; bool.TryParse(query["allow"], out bool allow); // 第二种场景逻辑处理 } }
.NET Framework Web API 版本实现:
[Route("v1/v2/v3")] public async Task<HttpResponseMessage> GetContent() { var queryDict = Request.GetQueryNameValuePairs() .ToDictionary(kv => kv.Key, kv => kv.Value); if (queryDict.ContainsKey("isFormatSimple")) { bool.TryParse(queryDict["isFormatSimple"], out bool isFormatSimple); // 第一种场景逻辑处理 } else if (queryDict.ContainsKey("vers") && queryDict.ContainsKey("allow")) { string vers = queryDict["vers"]; bool.TryParse(queryDict["allow"], out bool allow); // 第二种场景逻辑处理 } }
提示:上述代码使用
bool.TryParse替代直接解析,可避免参数值格式非法时抛出异常,你可以根据业务需要增加参数合法性校验逻辑。
内容的提问来源于stack exchange,提问作者LAffair
相关产品推荐
相关产品推荐

