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

ASP.NET Core 6 MVC中DateOnly字段提交出现异常日期如何解决

问题根因

控制器[Bind]特性未包含视图中实际提交的BirthDayUI字段,模型绑定阶段不会为该属性赋值,因此其set方法永远不会触发,BirthDay字段始终未被正确赋值,最终存入数据库的是未初始化的错误日期值,就是你看到的异常日期。


解决步骤

方案1:直接修复现有中转属性逻辑

修改Create方法的[Bind]特性,添加BirthDayUI字段,让模型绑定可以正常识别提交的日期值:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,Name,FirstName,BirthDay,Email,MobilePhone,LandLinePhone,PostalCity,PostalCode,PostalAdress,Gender,MedicalCertificate,MedicalCertificateStart,MedicalCertificateEnd,ProfilePicture,BirthDayUI")] Member member)
{
    if (ModelState.IsValid)
    {
        _context.Add(member);
        await _context.SaveChangesAsync();
        return RedirectToAction(nameof(Index));
    }

    return View(member);
}

修改完成后BirthDayUI的set方法会正常触发,自动把输入的日期转换为DateOnly类型赋值给BirthDay字段,和Npgsql的date类型适配完全符合要求。


方案2:全局配置DateOnly支持(无需中转属性,更简洁)

如果不想每个DateOnly字段都写中转属性,可以在ASP.NET Core 6中全局添加DateOnly的模型绑定和序列化支持,直接绑定原生DateOnly字段即可:

  1. 在Program.cs中添加如下配置:
builder.Services.AddControllersWithViews()
    .AddJsonOptions(options =>
    {
        // 新增DateOnly序列化转换器
        options.JsonSerializerOptions.Converters.Add(new System.Text.Json.Serialization.JsonDateOnlyConverter());
    })
    .AddMvcOptions(options =>
    {
        // 新增DateOnly模型绑定器
        options.ModelBinderProviders.Insert(0, new Microsoft.AspNetCore.Mvc.ModelBinding.Binders.DateOnlyModelBinderProvider());
    });
  1. 视图直接绑定BirthDay字段即可:
<div class="form-group">
      <label asp-for="BirthDay" class="control-label"></label>
      <input asp-for="BirthDay" class="form-control" type="date"/>
      <span asp-validation-for="BirthDay" class="text-danger"></span>
</div>
  1. 删掉模型类中的BirthDayUI中转属性即可,Npgsql会自动处理DateOnly到PostgreSQL date类型的映射,不会出现适配问题。

内容的提问来源于stack exchange,提问作者RJ1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:54:04