【问题标题】:ASP.NET Core Web API - Route Constraints for Lists/ArraysASP.NET Core Web API - 列表/数组的路由约束
【发布时间】:2018-12-13 22:37:50
【问题描述】:

我有一个简单的 ASP.NET Core 2.1 Web API 操作,它应该接收一个 guid 列表。

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

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

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

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

【问题讨论】:

  • 根据他们的docs看来好像没有一个
  • 你可以实现你的。查看 Scott 的这篇博文以帮助您入门:hanselman.com/blog/…
  • 您是否考虑过使用 [FromQuery] 从查询字符串(如 Info?guids=xxx&amp;guids=xxx)中获取 guid。您的操作需要 [FromQuery(Name = "guids")] List&lt;Guid&gt; guids

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


【解决方案1】:

我有两个选择。

一种选择是使用正则表达式。 [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}")]

尚未对此进行彻底测试,但稍作定制,它应该会给您一个良好的开端。

【讨论】:

    猜你喜欢
    • 2017-11-20
    • 2018-08-28
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多