.NET 5 MVC MultiSelectList在multipart表单中提交后无法获取值的问题
问题根因
多选框提交时只会传选中项的value组成的字符串数组,ASP.NET Core默认模型绑定无法直接将数组转换为ICollection<PatientFlags>类型,因此直接绑定PatientFlags属性会一直为空。
修复步骤
- 调整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);
- 修改视图代码,绑定到新增的
SelectedFlagIds属性,显式加multiple属性保证多选生效,同时删除无用的隐藏字段
<td> <select asp-for="SelectedFlagIds" asp-items="Model.FlagsMulti" multiple></select> </td>
- 调整控制器逻辑,用接收的
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
相关产品推荐
相关产品推荐

