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

.NET 5 MVC MultiSelectList在multipart表单中提交后无法获取值的问题

问题根因

多选框提交时只会传选中项的value组成的字符串数组,ASP.NET Core默认模型绑定无法直接将数组转换为ICollection<PatientFlags>类型,因此直接绑定PatientFlags属性会一直为空。

修复步骤

  1. 调整Patients模型,新增非映射属性接收选中的Flag ID数组
public class Patients
{
    [Key]
    public int Id { get; set; }
    [BindProperty]
    public int CA_ALERTId { get; set; }
    public int? NON_ALERTId { get; set; }
    public string State { get; set; }
    public List<Notes> Notes { get; set; }
    public string Location { get; set; }
    public string OffSiteLocation { get; set; }
    [NotMapped]
    public string Note { get; set; }
    public ICollection<PatientFlags> PatientFlags { get; set; }
    [NotMapped]
    public MultiSelectList FlagsMulti { get; set; }
    // 新增非映射属性接收多选值
    [NotMapped]
    public int[] SelectedFlagIds { get; set; }
}

注意:构造FlagsMulti时需指定value字段为PatientFlags的主键,示例如下:

// 控制器中初始化FlagsMulti的代码示例
var allFlags = _context.Flags.ToList();
patients.FlagsMulti = new MultiSelectList(allFlags, "FlagId", "FlagName", patients.SelectedFlagIds);
  1. 修改视图代码,绑定到新增的SelectedFlagIds属性,显式加multiple属性保证多选生效,同时删除无用的隐藏字段
<td>
      <select asp-for="SelectedFlagIds" asp-items="Model.FlagsMulti" multiple></select>
</td>
  1. 调整控制器逻辑,用接收的SelectedFlagIds构造PatientFlags对象
public async Task<JsonResult> Edit(Patients patients)
{
    Debug.WriteLine("***Editing Patiient");
    if(patients.Note != null)
    {
        await CreateNote(patients);
    }
    // 加载患者时建议Include PatientFlags避免重复添加
    Patients patient = _context.Patients.Include(p=>p.PatientFlags).First(p=>p.Id == patients.Id);
    if(patients.State != null)
    {
        patient.State = patients.State;
    }
    if (patients.Location != null)
    {
        patient.Location = patients.Location;
    }
    if (patients.OffSiteLocation != null)
    {
        patient.OffSiteLocation = patients.OffSiteLocation;
    }
    // 不需要给patient.FlagsMulti赋值,该字段仅用于视图渲染
    // 处理选中的Flag
    if(patients.SelectedFlagIds != null && patients.SelectedFlagIds.Any())
    {
        // 编辑场景可先清空原有Flag再添加
        patient.PatientFlags.Clear();
        foreach(var flagId in patients.SelectedFlagIds)
        {
            patient.PatientFlags.Add(new PatientFlags 
            {
                PatientId = patient.Id,
                FlagId = flagId
            });
        }
    }
    _context.Update(patient);
    await _context.SaveChangesAsync(); 
    // 后续逻辑
}

补充说明

如果是编辑场景需要回显已选Flag,查询患者数据后手动给SelectedFlagIds赋值即可:

patient.SelectedFlagIds = patient.PatientFlags.Select(pf => pf.FlagId).ToArray();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 23:54:01