【问题标题】:Exclude controller name from routing in net core asp从网络核心asp中的路由中排除控制器名称
【发布时间】: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,它将返回所有 albumsexecutorId = 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


    【解决方案1】:

    只需从控制器中的路由路径中删除 [控制器] 并将其移动到方法中。

    类似这样的:

    [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));
        }
    }
    

    【讨论】:

    • 它可能适用于 [HttpGet("[controller]/{id}", Name = "GetAlbum")] 但我还没有测试过
    • 这就是我在您第一次回答后所做的。它确实工作得很好。
    • 它同样适用于 MVC。从 ActionResult 中删除“[controller]”后,“asp-controller”将完全按照我想要的方式被忽略。
    【解决方案2】:

    如果你想获取专辑,你应该把action方法放在AlbumController

    我想这样推荐你:

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

    【讨论】:

    • 感谢您的回复。但我的想法是我希望我的 API 看起来像 www.site.com/api/v1/executors/1/albums
    猜你喜欢
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多