Tim*_*ard 2 c# asp.net-web-api-routing asp.net-core-mvc asp.net-core asp.net-core-2.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
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我希望此函数的路由如下所示:/ api / users / getinstitutionnamesbyid,但显然它似乎只是/ api / users,我确实感到困惑(如果我添加其他HttpGet函数会怎样?)。
谁能解释我在做什么错?我不是按预期方式使用Web Api控制器吗?我的选路错了吗?
提前致谢。
Kir*_*kin 11
[Route("api/[controller]")]
使用此模板,您可以明确地声明只关心控制器的名称。在您的示例中,GetInstitutionNamesById是action的名称,模板未考虑该名称。
这里有一些实现您要求的选项:
更改[Route]模板以包括操作名称:
[Route("api/[controller]/[action]")]
Run Code Online (Sandbox Code Playgroud)
此选项适用于控制器内的所有操作。
更改HttpGet约束属性以隐式指定操作:
[HttpGet("[action]")]
Run Code Online (Sandbox Code Playgroud)
此选项可确保您的操作方法的名称始终用作路由段。
更改HttpGet约束属性以显式指定操作:
[HttpGet("GetInstitutionNamesById")]
Run Code Online (Sandbox Code Playgroud)
该选项允许您使用与操作方法本身名称不同的路由段。
关于您是否在这里以正确的方式使用路由-这有点基于观点。通常,您会看到API正在尝试使用与资源匹配的路由模板来实现RESTful,通过这种方法,您可能会更喜欢以下内容:
[Route("api/[controller]/[action]")]
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您可能拥有单独的InstitutionNames控制器,或者将其捆绑到Users控制器中。确实有很多方法可以做到这一点,但是我在这里不再赘述,因为它有点偏离主题并且基于观点。
| 归档时间: |
|
| 查看次数: |
1913 次 |
| 最近记录: |