通过GET参数匹配控制器方法

时间:2017-05-26 12:42:22

标签: c# asp.net asp.net-mvc asp.net-web-api

我有一个标有[Route("api/entities")]的控制器。有一种获取所有实体的方法:

[Audit(ActionType.EntityList)] // custom annotation for audit
[Authorize]
[HttpGet]
public IActionResult GetEntities()
{
    // ...
}

正如您所看到的,通过使用注释,我将请求保存到某些审核中,并仅将请求授权给允许的用户。

现在,我想增强此端点,以便它可以返回前N个实体。示例请求:/api/entities?top=5。我发现我应该使用an optional parameter for the method and use if to detect the case

但是,我需要在审核中将此类调用保存为不同类型(例如[Audit(ActionType.EntityTop)]),我不需要授权(每个人都可以获取顶级实体)。

如何将/api/entities请求映射到一个方法,将/api/entities?top=N映射到另一个方法?在Spring的Java中,我会使用params field of @RequestMapping

我不想更改此端点的URL,因为top参数仅修改正在返回的列表,因此只有一个should use GET parameters。通过使用相同的URL,我也不会更改响应的语义含义(它仍然是相同实体的列表)。使用像Restangular这样的RESTful前端框架非常重要。

1 个答案:

答案 0 :(得分:1)

你确定需要同样的行动吗?看起来你想在这里解决不同的任务,所以我建议你创建另一个动作

[Audit(ActionType.EntityTop)]
[HttpGet("top/{top:int}")] //you can specify route via Annotations
public IActionResult GetEntities(int top)
{
    // ...
}

与顶级实体的请求将匹配/api/entities/top/5