.Net Core 2.2 Web API路由

问题描述 投票:1回答:2

我有以下控制器,我想用作ajax帖子的Web API控制器从我的用户表中检索数据。

namespace MyProjectName.Controllers.API
{
    [Route("api/[controller]")]
    [ApiController]
    public class UsersController : ControllerBase
    {
        private readonly myContext _context;
        public UsersController(myContext context)
        {
            _context = context;
        }

        [HttpGet]
        public List<string> GetInstitutionNamesById(int id)
        {
            // returns desired list
        }
    }
}

现在我希望这个函数的路由是这样的:/ api / users / getinstitutionnamesbyid但显然它似乎只是/ api / users我觉得很混乱(如果我添加额外的HttpGet函数怎么办?)。

谁能解释一下我做错了什么?我是否使用Web Api控制器而不是预期的方式?我的路由错了吗?

提前致谢。

c# asp.net-core asp.net-core-mvc asp.net-web-api-routing asp.net-core-2.2
2个回答
10
投票

[Route("api/[controller]")]

使用此模板,您明确声明您只关心控制器的名称。在您的示例中,GetInstitutionNamesById是操作的名称,模板未考虑该名称。

有几个选项可以实现您在这里要求的内容:

  1. 更改您的[Route]模板以包含操作名称: [Route("api/[controller]/[action]")] 此选项适用于控制器中的所有操作。
  2. 更改HttpGet约束属性以隐式指定操作: [HttpGet("[action]")] 此选项可确保将操作方法​​的名称始终用作路径段。
  3. 更改HttpGet约束属性以明确指定操作: [HttpGet("GetInstitutionNamesById")] 此选项允许您使用与操作方法本身名称不同的路径段。

关于你是否在这里以正确的方式使用路由 - 这有点基于意见。通常,您将看到API尝试使用RESTful,使用与资源匹配的路由模板等。使用此方法,您可能会有类似以下内容:

/api/Users/{userId}/InstitutionNames

在这种情况下,您可能有一个单独的InstitutionNames控制器,或者您可能将其捆绑到Users控制器中。有很多方法可以做到这一点,但我不会再讨论这个问题,因为它有点偏离主题和基于意见。


2
投票

你只需要这样命名

    [HttpGet("[action]/{id}")]
    public List<string> GetInstitutionNamesById(int id)
    {
        // returns desired list
    }

并从ajax调用/ api / users / GetInstitutionNamesById / 1

© www.soinside.com 2019 - 2024. All rights reserved.