ASP.NET Core Web API-列表/数组的路由约束

时间:2018-12-13 13:11:51

标签: asp.net-core asp.net-core-webapi

我有一个简单的ASP.NET Core 2.1 Web API操作,应该会收到一份指导清单。

现在,我正在尝试向路线添加正确的约束条件,但找不到列表示例。

现在我的操作看起来像这样,但这是单个值的约束。

[HttpGet("Info/{guids:guid}")]
public async Task<IActionResult> Get(Guid[] guids)
{
    return Ok();
}

是否可以添加此约束,或者现在没有可用的约束?

1 个答案:

答案 0 :(得分:0)

我为您提供2种选择。

一种选择是使用正则表达式。 [HttpGet("Info/{guids:regex((([{(]?[0-9A-F]{8}[-]?(?:[0-9A-F]{4}[-]?){3}[0-9A-F]{12}[)}]?)[\,]?)+)}")] 但这一点都不漂亮,而且很难阅读(我的正则表达式也需要重新审视,只是为了指出要点)。

更简洁的方法是实现自定义约束。

   public class GuidListConstraint : IRouteConstraint
{
    /// <inheritdoc />
    public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values,
        RouteDirection routeDirection)
    {
        var valueActuallySubmitted = values.TryGetValue(routeKey, out var value);

        if (!valueActuallySubmitted) return false;

        var guidListAsString = value.ToString();
        var splitOnComma = guidListAsString.Split(",", StringSplitOptions.RemoveEmptyEntries);

        foreach (var guidValue in splitOnComma)
        {
            var isProperGuid = Guid.TryParse(guidValue, out var _);
            if (!isProperGuid) return false;
        }

        return true;
    }
}

您可以在services.AddMvc()之后注册为

services.Configure<RouteOptions>(options => options.ConstraintMap.Add("myguidlist", typeof(GuidListConstraint)));

然后,您可以装饰自己的动作,例如 [HttpGet("Info/{guids:myguidlist}")]

尚未对此进行全面测试,但只需进行一些自定义,即可为您提供良好的开端。