C# 在net core asp中从路由中排除控制器名称

C# 在net core asp中从路由中排除控制器名称,c#,.net,asp.net-mvc,asp.net-core,asp.net-mvc-routing,C#,.net,Asp.net Mvc,Asp.net Core,Asp.net Mvc Routing,我正在使用asp net core mvc并尝试开发一个RESTful应用程序。假设我有这样的模型: 内部类相册 { 公共长Id{get;set;} 公共字符串名称{get;set;} 公共长执行器ID{get;set;} 公共虚拟执行器执行器{get;set;} } 内部类执行器 { 公共长Id{get;set;} 公共字符串名称{get;set;} 公共虚拟ICollection相册{get;set;} } 我有两个控制器,我这样写: [ApiVersion(“

我正在使用asp net core mvc并尝试开发一个RESTful应用程序。假设我有这样的模型:

内部类相册
{       
公共长Id{get;set;}
公共字符串名称{get;set;}
公共长执行器ID{get;set;}
公共虚拟执行器执行器{get;set;}
}
内部类执行器
{       
公共长Id{get;set;}
公共字符串名称{get;set;}
公共虚拟ICollection相册{get;set;}
}
我有两个控制器,我这样写:

[ApiVersion(“1”)]
[路由(“api/v{api版本:apiVersion}/[控制器]”)
公共类执行器控制器:控制器
{
[HttpGet(“{id}”,Name=“GetExecutor”)]
公共IActionResult GetById(长id)
{
//一些代码
}
[HttpGet(Name=“GetExecutors”)]
public IActionResult GetAll()
{
//一些代码
}
}
[第1版]
[路由(“api/v{api版本:apiVersion}/[控制器]”)
公共类控制器:控制器
{
[HttpGet(“{id}”,Name=“GetAlbum”)]
公共IActionResult GetById(长id)
{
//一些代码
}
[HttpGet(Name=“GetAlbums”)]
public IActionResult GetAll()
{
//一些代码
}
}
我可以打电话给
http://localhost:48234/api/v1/Album/1
并通过
Id
获取
相册
, 我可以打电话给
http://localhost:48234/api/v1/Album
并获取所有
相册
。同样的事情也适用于执行者。所以,我想做的是,能够通过
executorId
获得
albums
,我的路线是这样的
http://localhost:48234/api/v1/executors/1/albums
,它将返回
executor
的所有
相册,且
Id=1
。问题是我想将此操作放入相册控制器中:

[HttpGet]
[路由(“执行者/{executorId}/albums”)]
public IActionResult GetAlbumsByExecutorId(长执行器ID)
{
返回新的ObjectResult(_service.GetAlbumsByExecutorId(executorId));
}

此代码工作正常,但它将
ControllerName
(相册)放在开头。如何从路线中删除
ControllerName
?或者我不应该这样做,而只是将此操作放到执行器控制器上?我决定这样做,因为如果操作返回
相册
,它应该放在
相册控制器
中。我错了吗?

如果你想获得相册,你应该在
AlbumController
中放置操作方法

我想这样向您推荐:

[HttpGet(Name = 'GetAlbumsByExecutorId')]
[Route("{executorId}/albums")]
public IActionResult GetAlbumsByExecutorId(long executorId)
{
    return new ObjectResult(_service.GetAlbumsByExecutorId(executorId));
}

只需从controller中的路由路径中删除[controller],并将其移动到方法

大概是这样的:

[ApiVersion("1")]
[Route("api/v{api-version:apiVersion}/")]
public class AlbumController : Controller
{
   [HttpGet("album/{id}", Name = "GetAlbum")]
    public IActionResult GetById(long id)
    {
         //some code
    }

    [HttpGet("album", Name = "GetAlbums")]
    public IActionResult GetAll()
    {
        //some code
    }

    [HttpGet]
    [Route("executors/{executorId}/albums")]
    public IActionResult GetAlbumsByExecutorId(long executorId)
    {
         return new ObjectResult(_service.GetAlbumsByExecutorId(executorId));
    }
}

谢谢你的回复。但是我的想法是希望我的API看起来像www.site.com/API/v1/executors/1/albumsIt可能与[HttpGet(“[controller]/{id}”,Name=“GetAlbum”)]一起工作,但我还没有测试过,这是我在您第一次回答之后做的。它确实工作得很好,在MVC上也很好。在我从ActionResult中删除“[controller]”之后,“asp控制器”被完全按照我希望的方式忽略。