我已经创建了扩展ApiController的控制器类,并包含以下方法:
// GET api/Posts/5
[ResponseType(typeof(Post))]
public IHttpActionResult GetPost(int id)
{
...
}
// GET api/Posts/ByBoardID/2
[HttpGet]
[ActionName("ByBoardID")]
public IQueryable<Post> GetByBoardID(int boardID)
{
...
}
想法是将这些方法与给定路由匹配(即'api / Posts / ByBoardID / 2'到GetByBoardID(int boardID)方法,'api / Posts / 2'到GetPosts(int id)方法)
这是路线配置:
config.Routes.MapHttpRoute(
name: "ByParamApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional });
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional });
第二条路线('api / Posts / ByBoardID / 2')无法匹配 - No HTTP resource was found that matches the request URI
。
在控制器内部创建此类“嵌套”路由的最佳做法是什么?我将使用具有相同模式(/{controller}/{id} and /{controller}/bySpecialParam/{id})
的许多控制器,因此我不想'硬编码'这种不可重复使用的路由。
答案 0 :(得分:1)
只有通过改变这个组合才能实现这种组合
[ActionName("ByBoardID")]
到
[Route("api/Posts/ByBoardID/{boardID}")]
永远无法弄清楚ActionName属性的工作原理,因此始终首选使用Route属性
答案 1 :(得分:0)
这有效:
1)为控制器中的两个方法提供actionName。
[ActionName("DefaultAction")]
[ActionName("ByBoardID")]
2)在webapiconfig类中,添加以下路由
config.Routes.MapHttpRoute(
"defaultActionRoute",
"{controller}/{action}/{id}",
null,
new
{
action = "ByBoardId"
});
config.Routes.MapHttpRoute(
"defaultRoute",
"{controller}/{id}",
new
{
action = "DefaultAction"
});
确保GlobalConfiguration.Configuration.EnsureInitialized();
方法末尾有Application_Start()
。