如何将路由模板多参数映射到C# params以实现方法重写或隐藏
问题解答
1. 能否将"{a}/{b}/{c}"这类路由模板直接读取到基类方法的id参数中?
可以实现,有两种常用方式:
- 自定义模型绑定器:
编写一个实现IModelBinder的类,在绑定逻辑里从路由上下文取出所有匹配的路由参数(比如a、b、c),根据实体主键的类型转换后存入数组,绑定到params object?[]? id参数。然后在基类方法的id参数上加上[ModelBinder(BinderType = typeof(你的绑定器类型))],配合对应的路由模板(比如[HttpGet("{a}/{b}/{c}")]),就能自动把路由参数收集到id数组里。 - 路由通配符+手动转换:
给基类方法设置路由[HttpGet("{*ids}")],这里的*通配符会把所有后续路由段捕获成一个字符串(比如1/2/3)。在方法内部把这个字符串按/拆分,再逐个转换为对应主键类型的对象,最后传给EF Core的Find方法。
2. 其他实现带可变数量参数的HttpGet方法的方式
还有几个实用方案可以解决你的问题,尤其是能规避基类方法暴露的问题:
- 标记基类方法为
[NonAction]:
把基类的virtual方法加上[NonAction]特性,这样ASP.NET Core就不会把它当作API端点对外暴露。然后在派生类里实现自己的HttpGet方法(比如匹配多主键路由),内部调用基类的非Action方法。这直接解决了基类方法可见导致的异常问题。 - 用查询字符串传递多参数:
定义路由为[HttpGet],用[FromQuery] IEnumerable<object> ids接收查询参数(比如?ids=1&ids=2&ids=3),转成数组后传入Find方法。这种方式不需要复杂路由,适合参数数量不固定的场景。 - 针对复合主键声明明确参数:
对于有复合主键的实体,直接在派生类的HttpGet方法里声明对应数量的参数(比如[HttpGet("{id1}/{id2}")] public IActionResult Get(int id1, string id2)),然后把这些参数打包成数组传给基类方法。这种方式类型安全,不需要额外转换逻辑。
内容的提问来源于stack exchange,提问作者Mark Davich
相关产品推荐
相关产品推荐

