在控制器上没有找到任何操作
本文关键字:任何 操作 控制器 | 更新日期: 2023-09-27 18:10:22
我正在尝试在我的RESTapi中进行分层链接。例如:
下面的url会给我演员id 1的详细信息:
/api/v1/actor/id/1/
以下url预计会给我演员id为1的所有电影:
/api/v1/actor/1/movies
我的路线:
config.Routes.MapHttpRoute(
name: "DefaultCAApi",
routeTemplate: "api/v1/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultOneLevelNested",
routeTemplate: "api/v1/{controller}/{levelOneId}/{action}",
defaults: new { id = RouteParameter.Optional }
);
My Actions in ActorController
:
[HttpGet]
public HttpResponseMessage Id(int id)
{
// logic
return Request.CreateResponse(HttpStatusCode.OK, actor);
}
[HttpGet]
public HttpResponseMessage Movies(int levelOneId)
{
// logic
return Request.CreateResponse(HttpStatusCode.OK, movies);
}
但是这个设置不适合我。
/api/v1/actor/id/1/
给我适当的响应
但/api/v1/actor/1/movies
抛出以下错误:
No action was found on the controller 'Actor' that matches the name '1'."
我确实遵循了这个线程,但它不适合我。
有人能建议我在这里做错了什么吗?我使用MVC 4, WebAPI。试着改变你的路由顺序:
config.Routes.MapHttpRoute(
name: "DefaultOneLevelNested",
routeTemplate: "api/v1/{controller}/{levelOneId}/{action}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultCAApi",
routeTemplate: "api/v1/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
创建路由时,顺序很重要。你使用它的方式是,它首先匹配第一个(默认路由),而不是查找名称为"1"的操作。
你可能还想看看MVC属性路由,我认为这是一个更容易工作:http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx
这个工作为我做了一件事:
config.Routes.MapHttpRoute(
name: "DefaultCAApi",
routeTemplate: "api/v1/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "LevelOneNested",
routeTemplate: "api/v1/{controller}/{id}/details/{action}",
defaults: new { id = RouteParameter.Optional }
);
基本上我已经添加了1个路径级别到我的url。最后变成了:
/api/v1/actor/4/details/movies
使用这些路由:
config.Routes.MapHttpRoute(
name: "DefaultOneLevelNested",
routeTemplate: "api/v1/{controller}/{id}/{action}",
constraints: new { controller = "actor", action ="movies" }
);
config.Routes.MapHttpRoute(
name: "DefaultCAApi",
routeTemplate: "api/v1/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);