如何解决ASP.NET Core MVC中另存为功能报错428C9的问题
报错428C9解决方案
核心问题原因
- 模型绑定字段大小写不匹配:C#大小写敏感,视图中绑定的字段名为
IpAddress、ToolHostPort、ToolSvid,但Post接口Bind特性中写的是Ipaddress、Toolhostport、Toolsvid,字段名不匹配导致所有对应字段无法绑定到值,ModelState.IsValid验证直接失败。 - Pid字段重复提交:视图中同时存在Pid的可编辑输入框和隐藏域,提交时会传递两个重复的Pid值,引发绑定异常。
- 未处理原记录主键:GET读取原有记录时,会把原记录的主键值一并带到视图,提交插入时会触发主键冲突,这是触发428C9错误的直接原因。
修复步骤
- 修正Post接口的Bind特性,和视图字段名保持大小写一致:
// 修正前:[Bind("Ipaddress,Protocol,Toolhostport,Toolsvid,Pid")] [HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Saveas([Bind("IpAddress,Protocol,ToolHostPort,ToolSvid,Pid")] GatewaySettingCloud gatewaySettingCloud) { if (ModelState.IsValid) { _context.Add(gatewaySettingCloud); await _context.SaveChangesAsync(); return RedirectToAction(nameof(Index)); } return View(gatewaySettingCloud); }
- 删除视图中重复的Pid字段:如果允许用户编辑Pid,就删除隐藏的Pid输入框;如果不允许用户编辑Pid,就删除可编辑的Pid输入框,只保留隐藏域。
- GET接口返回视图前清空原记录的主键,避免插入时主键冲突:
public async Task<IActionResult> Saveas(int? id) { if (id == null) { return NotFound(); } var gatewaySettingCloud = await _context.GatewaySettingClouds.FindAsync(id); if (gatewaySettingCloud == null) { return NotFound(); } // 把Id替换为你的GatewaySettingCloud实体的实际主键字段名 gatewaySettingCloud.Id = default; return View(gatewaySettingCloud); }
- 若修复后仍有报错,可在Post方法内打断点查看
ModelState.Errors中的具体错误描述,即可定位剩余问题。
内容的提问来源于stack exchange,提问作者GG6565
相关产品推荐
相关产品推荐

