ASP.NET Core 3.1 MVC应用DateOfBirth字段无法更新始终重置为默认值如何解决
问题排查与修复方案
核心问题
最直接的触发原因是模型绑定参数名称不匹配:
- 编辑页的
<input asp-for="DateOfBirth">生成的HTML元素name属性为DateOfBirth,提交时表单对应的字段键为DateOfBirth - 后端
EditUser接口接收出生日期的参数命名为birthDate,和提交的字段名不匹配,导致模型绑定失败,DateTime值类型被自动赋值为默认值0001/1/1 0:00:00,更新到数据库就表现为被重置。
修复步骤
1. 修正控制器参数命名(优先修复)
把EditUser方法的出生日期参数名改为和提交字段一致的DateOfBirth,同时同步调用服务层的传参:
[HttpPost] public async Task<IActionResult> EditUser(string firstName, string lastName, string email, DateTime DateOfBirth, string country) { var userId = _userManager.GetUserId(User); await _userService.UpdateUserInfo(userId, firstName, lastName, email, DateOfBirth, country); return RedirectToAction("Detail", "Profile", new { id = userId }); }
更推荐直接用视图模型接收参数,避免零散参数命名出错:
[HttpPost] public async Task<IActionResult> EditUser(ProfileModel model) { var userId = _userManager.GetUserId(User); await _userService.UpdateUserInfo(userId, model.FirstName, model.LastName, model.Email, model.DateOfBirth, model.Country); return RedirectToAction("Detail", "Profile", new { id = userId }); }
2. 解决日期格式绑定问题
你当前设置的日期格式为MM.dd.yyyy,ASP.NET Core默认模型绑定对带点分隔的日期解析成功率较低,可任选以下方案优化:
- 方案1:将编辑框改为日期类型输入,使用浏览器标准日期格式,避免解析问题:
<input type="date" asp-for="DateOfBirth" placeholder=" " />
- 方案2:在视图模型字段上加
[DataType(DataType.Date)]注解,或者自定义全局DateTime模型绑定规则,支持MM.dd.yyyy格式解析。 - 方案3:将视图模型的
DateOfBirth改为可空类型DateTime?,避免绑定失败时自动赋值默认值,可搭配非空校验避免非法提交:
[DisplayFormat(DataFormatString = "{0:MM.dd.yyyy}", ApplyFormatInEditMode = true)] public DateTime? DateOfBirth { get; set; }
3. 额外排查点
检查模态框的出生日期输入框是否在提交表单的标签范围内,避免字段没有随表单一起提交。
内容的提问来源于stack exchange,提问作者Oggie
相关产品推荐
相关产品推荐

