C# .Net Core 2.2 Web API路由
我有下面的控制器,我想用它作为ajax帖子的WebAPI控制器,从我的用户表中检索数据C# .Net Core 2.2 Web API路由,c#,asp.net-core,asp.net-core-mvc,asp.net-web-api-routing,asp.net-core-2.2,C#,Asp.net Core,Asp.net Core Mvc,Asp.net Web Api Routing,Asp.net Core 2.2,我有下面的控制器,我想用它作为ajax帖子的WebAPI控制器,从我的用户表中检索数据 namespace MyProjectName.Controllers.API { [Route("api/[controller]")] [ApiController] public class UsersController : ControllerBase { private readonly myContext _context; pub
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
}
}
}
名称空间MyProjectName.Controllers.API
{
[路由(“api/[控制器]”)]
[ApiController]
公共类UsersController:ControllerBase
{
私有只读myContext\u上下文;
公共用户控制器(myContext上下文)
{
_上下文=上下文;
}
[HttpGet]
公共列表GetInstitutionNamesById(int id)
{
//返回所需列表
}
}
}
现在我希望这个函数的路由是这样的:/api/users/getinstitutionnamesbyid,但显然它似乎只是/api/users,这让我感到非常困惑(如果我添加额外的HttpGet函数呢?)
谁能解释一下我做错了什么?我使用Web Api控制器不是预期的方式吗?我的路线错了吗
提前谢谢
[路由(“api/[控制器]”)]
使用此模板,您明确表示只关心控制器的名称。在您的示例中,GetInstitutionNamesById
是模板未考虑的操作名称
这里有几个选项可以实现您的要求:
[Route]
模板以包含操作名称:
[Route("api/[controller]/[action]")]
此选项适用于控制器内的所有操作HttpGet
约束属性以隐式指定操作:
此选项确保操作方法的名称始终用作路由
部分HttpGet
constraint属性以明确指定操作:
此选项允许您使用与操作方法本身名称不同的路由段/api/Users/{userId}/InstitutionNames
在这种情况下,您可能有一个单独的
InstitutionNames
控制器,或者您可以将其捆绑到Users
控制器中。确实有很多方法可以做到这一点,但我在此不再赘述,因为这有点离题,而且是基于观点的。你只需要这样命名就可以了
[HttpGet("[action]/{id}")]
public List<string> GetInstitutionNamesById(int id)
{
// returns desired list
}
[HttpGet(“[action]/{id}”)]
公共列表GetInstitutionNamesById(int id)
{
//返回所需列表
}
从ajax调用/api/users/GetInstitutionNamesById/1中,我同意api中的命名是令人困惑的。但我认为api的要点是,控制器的名称是您希望从中获得的,因此您实际上只有一个get操作(方法的名称与“get”无关),否则会更加混乱。您需要为其他get操作编写另一个控制器。但您也可以使用重载选项获取特定的数字,如:/api/users/3
[HttpGet("GetInstitutionNamesById")]
[HttpGet("[action]/{id}")]
public List<string> GetInstitutionNamesById(int id)
{
// returns desired list
}