我有一个简单的ASP.NET Core 2.1 Web API操作,应该会收到一份指导清单。
现在,我正在尝试向路线添加正确的约束条件,但找不到列表示例。
现在我的操作看起来像这样,但这是单个值的约束。
[HttpGet("Info/{guids:guid}")]
public async Task<IActionResult> Get(Guid[] guids)
{
return Ok();
}
是否可以添加此约束,或者现在没有可用的约束?
答案 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}")]
尚未对此进行全面测试,但只需进行一些自定义,即可为您提供良好的开端。