在控制器上没有找到任何操作

本文关键字:任何 操作 控制器 | 更新日期: 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 }
);