.NET Core API控制器混合路由与查询参数绑定问题
解决C# Web API中路由参数与查询参数绑定的ArgumentException问题
你的异常根源很明确:路由模板里不能包含?字符,而且查询参数(start、end)根本不需要写在路由模板里,Web API框架会自动完成查询参数的绑定。
正确的控制器写法
直接把路由参数(id)定义在路由模板中,查询参数作为Action方法的参数即可,框架会自动从URL的查询字符串里提取并绑定:
[ApiController] [Route("api/[controller]")] public class RoomEventsController : ControllerBase { // 路由模板只声明路由参数id,start和end靠框架自动绑定查询参数 [HttpGet("{id}")] public IActionResult GetRoomEvents(string id, DateTimeOffset start, DateTimeOffset end) { // 这里可以直接使用三个参数做业务处理 return Ok(new { RoomEventId = id, StartTime = start, EndTime = end }); } }
关键说明
{id}是路由参数,对应URL中api/roomEvents/后面的1a,会被自动绑定到方法的id参数start和end是查询参数,Web API会自动解析URL中?后面的键值对,匹配方法参数名完成绑定- 推荐用
DateTimeOffset类型接收日期参数,因为你的查询参数包含时区偏移(比如-04:00),这个类型能正确解析带时区的时间字符串,避免解析错误
错误写法示例(别这么写)
之前抛出异常的原因大概率是你在路由模板里错误地包含了查询参数和?,比如这种写法是绝对禁止的:
// 错误写法:路由模板里出现了?和查询参数,会直接抛出ArgumentException [HttpGet("{id}?start={start}&end={end}")]
内容的提问来源于stack exchange,提问作者Bryan Dellinger
相关产品推荐
相关产品推荐

