You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

前后端分离项目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格式和前端提交的日期格式:

  1. 创建自定义日期转换器类:
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"));
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 08:40:36