我正在开发 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; }
}
请指教。
您可以使用字符串和正则表达式
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 是字符串