3 回答
TA贡献1775条经验 获得超8个赞
对于路由验证,您应该避免使用 for input validation
。
不要对输入验证使用约束。如果约束用于输入验证,则无效输入会导致 404 - Not Found 响应,而不是带有相应错误消息的 400 - Bad Request。路线约束用于消除相似路线的歧义,而不是验证特定路线的输入。
如果您想通过路由约束检查输入,您可以通过实现IRouteConstraint
.
DateRouteConstraint
public class DateRouteConstraint : IRouteConstraint
{
public static string DateRouteConstraintName = "DateRouteConstraint";
public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
{
object dateValue;
if (values.TryGetValue("date", out dateValue))
{
DateTime date;
string[] formats = { "yyyy-MM-dd" };
if (DateTime.TryParseExact(dateValue.ToString(), formats,
CultureInfo.InvariantCulture,
DateTimeStyles.None, out date))
{
return true;
}
}
return false;
}
}
登记DateRouteConstraint
services.AddRouting(options =>
{
options.ConstraintMap.Add(DateRouteConstraint.DateRouteConstraintName, typeof(DateRouteConstraint));
});
使用案例
[HttpGet("{date:DateRouteConstraint}")]
public ActionResult<string> Get(DateTime date)
{
return Ok();
}
TA贡献1825条经验 获得超4个赞
这里有一个例子:
https://learn.microsoft.com/en-us/aspnet/web-api/overview/web-api-routing-and-actions/create-a-rest-api-with-attribute-routing#get-books-by-publication-date
使用 dotnet core 3 我必须转义 { 和 } (使它们加倍),它很简单:
[HttpGet("{date:datetime:regex(\\d{{4}}-\\d{{2}}-\\d{{2}})}")]
public WeatherForecast GetForecast(DateTime date)
...
TA贡献1797条经验 获得超4个赞
您不能将RegularExpression
属性应用于 a DateTime
,因为它不是字符串;该属性仅对字符串有效。
您可以使用正则表达式路由约束,即[HttpGet("{date:regex(...)}")]
,但在这种情况下,您最好使用约束datetime
:[HttpGet("{date:datetime}")]
。
- 3 回答
- 0 关注
- 143 浏览
添加回答
举报