ASP.NET Core WEB ASP 输入格式验证

问题描述 投票:0回答:1

我正在开发 Web API(Asp.net core),我有一个 get 方法,需要(开始和结束日期作为输入参数)

我想确保日期采用“YYYY-MM-DD”格式。否则,会出现错误“日期应采用 YYYY-MM-DD 格式”

我正在使用流畅的验证,但不确定如何验证它。或通过数据注释

public async Task<IActionResult> Get([FromQuery] DataParameter input) {    
}

public class DataParameter {
    public DateTime? StartDate { get; set; }
    public DateTime? EndDate { get; set; }
}

请指教。

c# asp.net-core asp.net-core-webapi
1个回答
3
投票

您可以使用字符串和正则表达式

public class DataParameter
{
   [RegularExpression(@"^\d{4}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])$", ErrorMessage = "Date should be in YYYY-MM-DD format")]
   public string StartDate { get; set; }

   [RegularExpression(@"^\d{4}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])$", ErrorMessage = "Date should be in YYYY-MM-DD format")]
   public string EndDate { get; set; }
}

正则表达式来自这里

或者创建你自己的属性,像这样

public class DateFormatAttribute : ValidationAttribute
{
    private readonly string _format;

    public DateFormatAttribute(string format)
        : base($"Date should be in {format} format.")
    {
        _format = format;
    }

    public override bool IsValid(object value)
    {
        if (value is not string dateStr)
        {
            return false;
        }

        return DateTime.TryParseExact(dateStr, _format, CultureInfo.InvariantCulture, DateTimeStyles.None, out _);
    }
}

然后按如下方式使用

[DateFormat("yyyy-MM-dd")]
public string StartDate { get; set; }

FluentValidation 实现

RuleFor(c => c.StartDate)
   .Must(x => DateTime.TryParseExact(x, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out _))
   .When(x => !string.IsNullOrWhiteSpace(x.StartDate))
   .WithMessage("Date should be in yyyy-MM-dd format");

注意 StartDate 和 EndDate 是字符串

© www.soinside.com 2019 - 2024. All rights reserved.