从 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
对于 executor
和 Id = 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));
}
}
我正在使用 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
对于 executor
和 Id = 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));
}
}