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字段即可:
- 在
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()); });
- 视图直接绑定
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>
- 删掉模型类中的
BirthDayUI中转属性即可,Npgsql会自动处理DateOnly到PostgreSQL date类型的映射,不会出现适配问题。
内容的提问来源于stack exchange,提问作者RJ1
相关产品推荐
相关产品推荐

