为了账号安全,请及时绑定邮箱和手机立即绑定

使用日期格式的路由参数验证

使用日期格式的路由参数验证

C#
摇曳的蔷薇 2023-07-09 17:50:29
我收到所有输入的验证失败消息(状态代码 400),当我将日期格式更改为字符串时,正则表达式有效,但 DateType 验证不起作用。它接受 2019-02-31 作为有效输入。知道如何使其工作 DateTime 参数类型吗?    [HttpGet("{date}")]    public ActionResult<string> Get( [RegularExpression(@"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"), DataType(DataType.Date)] DateTime date)    {         return Ok();    }
查看完整描述

3 回答

?
www说

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();

}


查看完整回答
反对 回复 2023-07-09
?
凤凰求蛊

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)

...


查看完整回答
反对 回复 2023-07-09
?
繁星coding

TA贡献1797条经验 获得超4个赞

您不能将RegularExpression属性应用于 a DateTime,因为它不是字符串;该属性仅对字符串有效。

可以使用正则表达式路由约束,即[HttpGet("{date:regex(...)}")],但在这种情况下,您最好使用约束datetime[HttpGet("{date:datetime}")]


查看完整回答
反对 回复 2023-07-09
  • 3 回答
  • 0 关注
  • 103 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信