.NET 6 Web API DateTime格式设置及验证消息格式修正问题
修正.NET 6 Web API中Range验证消息的日期格式
在将.NET Framework 4.7 Web API迁移至.NET 6后,模型中已通过[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}")]配置DateTime格式为yyyy-MM-dd,API能正常接收该格式的日期,但触发Range验证时,返回的错误消息中日期显示为1/1/2015 12:00:00 AM格式,不符合预期。以下是几种可行的解决方法:
解决方案1:自定义RangeAttribute(推荐复用场景)
创建自定义的日期范围验证属性,重写错误消息格式化逻辑,强制使用指定的日期格式:
public class DateRangeAttribute : RangeAttribute { private readonly string _dateFormat; public DateRangeAttribute(string minDate, string maxDate, string dateFormat = "yyyy-MM-dd") : base(typeof(DateTime), minDate, maxDate) { _dateFormat = dateFormat; } public override string FormatErrorMessage(string name) { if (DateTime.TryParse(Minimum.ToString(), out var min) && DateTime.TryParse(Maximum.ToString(), out var max)) { return string.Format(ErrorMessageString, name, min.ToString(_dateFormat), max.ToString(_dateFormat)); } return base.FormatErrorMessage(name); } }
在模型中替换原有[Range]属性:
public class ExportStatisticParams { [Required] [DataType(DataType.Date)] [DateRange("2015-1-1", "2030-12-31")] [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}")] public DateTime StartDate { get; set; } [Required] [DataType(DataType.Date)] [DateRange("2015-1-1", "2030-12-31")] [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}")] public DateTime EndDate { get; set; } }
解决方案2:直接指定RangeAttribute的ErrorMessage(快速解决)
在[Range]属性中手动定义错误消息,通过格式字符串指定日期显示格式:
public class ExportStatisticParams { [Required] [DataType(DataType.Date)] [Range(typeof(DateTime), "2015-1-1", "2030-12-31", ErrorMessage = "{0}必须介于{1:yyyy-MM-dd}和{2:yyyy-MM-dd}之间")] [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}")] public DateTime StartDate { get; set; } [Required] [DataType(DataType.Date)] [Range(typeof(DateTime), "2015-1-1", "2030-12-31", ErrorMessage = "{0}必须介于{1:yyyy-MM-dd}和{2:yyyy-MM-dd}之间")] [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}")] public DateTime EndDate { get; set; } }
解决方案3:全局配置验证消息格式(项目统一规范)
在Program.cs中配置模型验证的消息提供器,统一修改日期范围验证的错误消息格式:
builder.Services.AddControllers() .AddMvcOptions(options => { // 自定义日期范围验证的错误消息格式 options.ModelBindingMessageProvider.SetDateRangeInvalidAccessor((minDate, maxDate) => $"日期必须介于{minDate:yyyy-MM-dd}和{maxDate:yyyy-MM-dd}之间"); // 自定义RangeAttribute的默认错误消息模板 options.DataAnnotationsValidatorProvider.AddValidationAttributeProvider((context, attribute) => { if (attribute is RangeAttribute rangeAttr && rangeAttr.OperandType == typeof(DateTime)) { if (DateTime.TryParse(rangeAttr.Minimum.ToString(), out var min) && DateTime.TryParse(rangeAttr.Maximum.ToString(), out var max)) { rangeAttr.ErrorMessage = $"{context.DisplayName}必须介于{min:yyyy-MM-dd}和{max:yyyy-MM-dd}之间"; } } }); });
内容的提问来源于stack exchange,提问作者Tomas
相关产品推荐
相关产品推荐

