ASP.NET Core表单提交时asp-for绑定director无值的问题
问题原因分析
表单提交的是选中的Worker的ID(Guid字符串),但你的Project模型中director字段是完整的Worker实体对象。ASP.NET Core的默认模型绑定器无法自动将单个ID值转换为Worker对象,导致绑定失败,director字段为空。同时因为绑定失败,ModelState会标记该字段验证无效,从而触发"The director field is required."的错误提示。
解决方案
方法一:新增ID属性接收表单值(推荐)
这是最贴合ASP.NET Core模型绑定规范的方案,代码清晰易维护:
- 修改Project类:添加用于接收表单提交ID的属性
public class Project { [Required] public Guid id { set; get; } [Required] public string name { set; get; } public string customer { set; get; } public string executor { set; get; } // 新增:用于接收表单提交的Worker ID public Guid DirectorId { get; set; } // 原有的Worker实体字段 public Worker director { set; get; } public DateTime start { set; get; } public DateTime end { set; get; } public uint priority { set; get; } }
- 修改表单的Select标签:将绑定目标改为新增的
DirectorId属性
<div> <label asp-for="DirectorId">Director</label> <select asp-for="DirectorId" asp-items=@ViewBag.workers> </select> <span asp-validation-for="DirectorId"></span> </div>
- 修改Post处理方法:通过ID查询Worker对象并赋值
[HttpPost] public IActionResult Edit(Project model) { // 根据提交的DirectorId从数据库查询对应的Worker model.director = dataManager.worker.GetWorkerById(model.DirectorId); if (ModelState.IsValid) { dataManager.project.SaveProject(model); return RedirectToAction(nameof(HomeController.Index), nameof(HomeController).Replace("Controller", "")); } ViewBag.workers = new SelectList(dataManager.worker.GetAllWorkers(), nameof(Worker.id), nameof(Worker.name)); return View(model); }
方法二:直接从Request获取ID赋值(无需修改模型)
如果不想修改Project模型,可以直接从Request中提取提交的ID,再查询Worker对象:
[HttpPost] public IActionResult Edit(Project model) { if (Guid.TryParse(Request.Form["director"], out var directorId)) { model.director = dataManager.worker.GetWorkerById(directorId); // 清除绑定失败导致的ModelState错误 ModelState.Remove("director"); } if (ModelState.IsValid) { dataManager.project.SaveProject(model); return RedirectToAction(nameof(HomeController.Index), nameof(HomeController).Replace("Controller", "")); } ViewBag.workers = new SelectList(dataManager.worker.GetAllWorkers(), nameof(Worker.id), nameof(Worker.name)); return View(model); }
内容的提问来源于stack exchange,提问作者Nikita Kalinin
相关产品推荐
相关产品推荐

