前后端分离项目CourseStart字段FormatException报错排查求助
问题分析与解决方案
核心问题
前端表单提交的日期格式与后端API期望的格式不匹配,导致后端解析时抛出FormatException。具体来说:
- 后端API接受ISO 8601格式(如
2022-12-15T00:00:00) - 前端通过
asp-for生成的日期输入框默认提交yyyy-MM-dd格式(无时间部分),或因实体上的DisplayFormat配置提交dd/MM/yyyy格式,均不符合API解析要求
解决方案
方案1:让后端兼容多种日期格式
通过自定义JSON转换器,让后端同时支持ISO格式和前端提交的日期格式:
- 创建自定义日期转换器类:
public class DateTimeConverter : JsonConverter<DateTime> { // 支持的日期格式列表 private readonly string[] _supportedFormats = new[] { "yyyy-MM-ddTHH:mm:ss", "dd/MM/yyyy", "yyyy-MM-dd" }; public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (DateTime.TryParseExact(reader.GetString(), _supportedFormats, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime parsedDate)) { return parsedDate; } // 兜底解析 return DateTime.Parse(reader.GetString(), CultureInfo.InvariantCulture); } public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options) { // 统一输出ISO格式 writer.WriteStringValue(value.ToString("yyyy-MM-ddTHH:mm:ss")); } }
- 在
Program.cs中注册转换器:
builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new DateTimeConverter()); options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; });
方案2:前端转换日期为ISO格式提交
通过JavaScript在表单提交前,将日期转换为后端期望的ISO格式:
document.querySelector('form').addEventListener('submit', function(e) { // 获取日期输入框 const startInput = document.querySelector('[asp-for="CourseStart"]'); const endInput = document.querySelector('[asp-for="CourseEnd"]'); // 转换为ISO格式 if (startInput.value) { const date = new Date(startInput.value); startInput.value = date.toISOString(); } if (endInput.value) { const date = new Date(endInput.value); endInput.value = date.toISOString(); } });
补充说明
实体类上的[DisplayFormat(DataFormatString = "{dd/MM/yyyy}", ApplyFormatInEditMode = true)]仅作用于MVC视图的显示与编辑渲染,不会影响API的模型绑定逻辑。如果需要视图显示和API解析同时兼容,建议结合上述两种方案使用。
内容的提问来源于stack exchange,提问作者Mnda90
相关产品推荐
相关产品推荐

