【发布时间】:2018-04-20 20:05:05
【问题描述】:
我正在使用 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,它将返回所有 albums 和 executor 和 Id = 1。问题是我想把这个动作放到AlbumsController:
[HttpGet]
[Route("executors/{executorId}/albums")]
public IActionResult GetAlbumsByExecutorId(long executorId)
{
return new ObjectResult(_service.GetAlbumsByExecutorId(executorId));
}
这段代码工作得很好,但它把ControllerName(专辑)放在了开头。如何从我的路线中删除 ControllerName?或者也许我不应该这样做,只是把这个动作交给ExecutorsController?我决定这样做,因为如果动作返回albums,它应该放在AlbumsController。我错了吗?
【问题讨论】:
标签: c# .net asp.net-mvc asp.net-core asp.net-mvc-routing