我有以下控制器,我想用作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控制器而不是预期的方式?我的路由错了吗?
提前致谢。
[Route("api/[controller]")]
使用此模板,您明确声明您只关心控制器的名称。在您的示例中,GetInstitutionNamesById
是操作的名称,模板未考虑该名称。
有几个选项可以实现您在这里要求的内容:
[Route]
模板以包含操作名称:
[Route("api/[controller]/[action]")]
此选项适用于控制器中的所有操作。HttpGet
约束属性以隐式指定操作:
[HttpGet("[action]")]
此选项可确保将操作方法的名称始终用作路径段。HttpGet
约束属性以明确指定操作:
[HttpGet("GetInstitutionNamesById")]
此选项允许您使用与操作方法本身名称不同的路径段。关于你是否在这里以正确的方式使用路由 - 这有点基于意见。通常,您将看到API尝试使用RESTful,使用与资源匹配的路由模板等。使用此方法,您可能会有类似以下内容:
/api/Users/{userId}/InstitutionNames
在这种情况下,您可能有一个单独的InstitutionNames
控制器,或者您可能将其捆绑到Users
控制器中。有很多方法可以做到这一点,但我不会再讨论这个问题,因为它有点偏离主题和基于意见。
你只需要这样命名
[HttpGet("[action]/{id}")]
public List<string> GetInstitutionNamesById(int id)
{
// returns desired list
}
并从ajax调用/ api / users / GetInstitutionNamesById / 1