我有一个ASP .Net Core 1.1 Web Api。在我的一个控制器中,我想要两个动作:
[HttpGet("{userId:int}")]
public async Task<IActionResult> GetUser([FromRoute] int id)
{
return Ok(_context.User.Where(u.Id == id));
}
[HttpGet("{groupId:int}")]
public async Task<IActionResult> GetUsersInGroup([FromRoute] int groupId)
{
return Ok(_context.User.Where(u.GroupId == groupId));
}
除方法名称外,两个操作都具有相同的签名。我怎样才能做到这一点,以便我可以打电话给其中一个?
...谢谢
答案 0 :(得分:1)
从路由组件的角度考虑它。如果您收到for /f "skip=7 eol=: delims=" %%F in ('dir /b /o-d /a-d *.txt') do @del "%%F"
之类的网址并且您在控制器中执行了上述操作,您会怎么做?
你必须区分它们,例如属性:
/api/users/123
现在可以通过以下方式访问它们:
[Route("api/users")]
public class UsersController : Controller
{
[HttpGet("{userId:int}")]
public async Task<IActionResult> GetUser([FromRoute] int userId)
{
return Ok(_context.User.Where(u.Id == userId));
}
[HttpGet("group/{groupId:int}")]
public async Task<IActionResult> GetUsersInGroup([FromRoute] int groupId)
{
return Ok(_context.User.Where(u.GroupId == groupId));
}
}
/api/users/123
控制器级别Route-attribute为所有路由设置公共前缀,因此您无需为所有路由指定它。
然后HttpGet属性指定了一个额外的前缀,因此它们基本上是不同的路由。