从 net core 中的路由中排除控制器名称 asp

Exclude controller name from routing in net core asp

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

internal class Album 
{       
    public long Id { get; set; }
    public string Name { get; set; }
    public long ExecutorId { get; set; }
    public virtual Executor Executor { get; set; }
}


internal class Executor 
{       
    public long Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Album> Albums { get; set; }
}

我有 2 个控制器,我是这样写的:

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

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

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

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

我可以调用 http://localhost:48234/api/v1/Album/1 并通过 Id 获得 album, 我可以调用 http://localhost:48234/api/v1/Album 并获得所有 albums。同样的事情也适用于 executors。所以,我想做的是能够通过 executorId 获得 albums 并且我的路线看起来像 http://localhost:48234/api/v1/executors/1/albums,这将 return 所有 albums 对于 executorId = 1。问题是我想把这个动作放到 AlbumsController:

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

这段代码工作得很好,但它把 ControllerName (Albums) 放在了开头。如何从我的路线中删除 ControllerName?或者也许我不应该这样做而只是将此操作放在 ExecutorsController 上?我决定这样做,因为如果action returns albums,它应该放在AlbumsController。我错了吗?

如果你想获取相册,你应该把操作方法放在AlbumController

我想这样推荐你:

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

只需从控制器中的路由路径中删除 [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));
    }
}