C# 在net core asp中从路由中排除控制器名称
我正在使用asp net core mvc并尝试开发一个RESTful应用程序。假设我有这样的模型: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(“
内部类相册
{
公共长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控制器”被完全按照我希望的方式忽略。