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

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模型绑定规范的方案,代码清晰易维护:

  1. 修改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; }
}
  1. 修改表单的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>
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:50:41