.NET Core MVC:下拉框绑定集合属性生成multiple,如何取消?
解决方案:无需新增单独属性解决下拉框多选与默认展开问题
问题根源在于你绑定的是ICollection<int?>集合类型,ASP.NET的HTML辅助方法会默认将集合类型的绑定识别为多选场景,因此自动给<select>标签加上multiple属性,而部分浏览器或UI组件会对带multiple的下拉框默认展开所有选项。
不用新增8个单独属性的话,有两种可行方案:
方案1:利用集合索引器绑定单个元素
把模型里的Employees改为List<int?>类型(ICollection没有索引器,List支持),然后在控制器初始化时给集合填充8个空元素:
// 控制器中初始化模型 var model = new YourModel(); model.Employees = new List<int?>(new int?[8]); // 初始化8个可空int的位置
然后在视图中用循环绑定集合的单个索引项:
@for (int i = 0; i < 8; i++) { @Html.DropDownListFor(m => m.Employees[i], (SelectList)ViewBag.Employees, "请选择员工") }
这样每个下拉框绑定的是集合里的单个int?值,而非整个集合,辅助方法就不会生成multiple属性,下拉框也会恢复点击展开的默认行为。
方案2:手动指定表单name属性,后台手动收集值
如果不想修改模型的集合类型,可在视图中给每个下拉框指定独立的name,不直接绑定到集合:
@for (int i = 0; i < 8; i++) { @Html.DropDownList($"EmployeeItem_{i}", (SelectList)ViewBag.Employees, "请选择员工") }
然后在POST请求的控制器方法中,手动从表单收集这些值并填充到模型的Employees集合:
[HttpPost] public ActionResult YourAction(YourModel model) { model.Employees = new List<int?>(); for (int i = 0; i < 8; i++) { if (int.TryParse(Request.Form[$"EmployeeItem_{i}"], out int empId)) { model.Employees.Add(empId); } else { model.Employees.Add(null); } } // 后续逻辑处理 return View(model); }
这两种方法都不需要新增8个单独的属性,就能解决你遇到的两个问题。
内容的提问来源于stack exchange,提问作者SuperNev
相关产品推荐
相关产品推荐

