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

ASP.NET MVC视图下拉列表绑定控制器异常:员工提交数据为空

问题原因

表单提交的是员工ID字符串,但你的AddAssignmentViewModel中assignee是Employee类型。ASP.NET MVC默认模型绑定无法将字符串直接实例化为Employee对象,导致提交后addAssignmentRequest.assignee始终为空。

修复方案

1. 修改视图模型

添加用于接收员工ID的属性,保留原assignee属性(可选,用于视图回显等场景):

public class AddAssignmentViewModel
{
    public string title { get; set; }
    public string description { get; set; }
    // 新增属性接收下拉框提交的员工ID
    public Guid assigneeId { get; set; }
    // 保留原属性(如需在视图中显示员工信息)
    public Employee assignee { get; set; }
    public DateTime dueDate { get; set; }
}

2. 更新视图下拉框

将asp-for指向新增的assigneeId属性:

<div class="mb-3">
    <label for="" class="form-label">Assignee</label>
    <select asp-for="assigneeId" class="form-control" asp-items="ViewBag.assignee"></select>
</div>

3. 修改控制器Post方法

通过提交的assigneeId从数据库查询对应员工,再赋值给Assignment的assignee:

[HttpPost]
public async Task<IActionResult> Add(AddAssignmentViewModel addAssignmentRequest)
{
    // 根据ID从数据库获取员工实例
    var assignee = await dataContext.Employees.FindAsync(addAssignmentRequest.assigneeId);
    
    var assignment = new Assignment()
        {
            taskID = Guid.NewGuid(),
            title = addAssignmentRequest.title,
            description = addAssignmentRequest.description,
            assignee = assignee,
            dueDate = addAssignmentRequest.dueDate,
        };

    await dataContext.Assignments.AddAsync(assignment);
    await dataContext.SaveChangesAsync();

    return RedirectToAction("Index");
}

额外提示

  • 若Employee表主键不是Guid类型,需对应修改assigneeId的类型(如int)。
  • 可以给assigneeId添加[Required]注解强制用户选择员工:
    [Required(ErrorMessage = "请选择员工")]
    public Guid assigneeId { get; set; }
    

内容的提问来源于stack exchange,提问作者jos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 23:47:15