如何基于值设置下拉框默认选中及解决SelectList无ForEach方法报错
让我一步步帮你解决这两个问题,先从你当前遇到的编译错误入手:
解决CS1061编译错误
你碰到的CS1061错误,本质原因是SelectList类本身并没有ForEach方法。它虽然实现了IEnumerable接口,但ForEach是List<T>专属的实例方法,并非通用的LINQ扩展方法,所以直接调用pstSelect.ForEach肯定会编译失败。
不过更关键的是:你根本不需要手动循环设置Selected属性!ASP.NET MVC的DropDownListFor辅助方法本身就支持模型绑定,它会自动根据你绑定的模型值(也就是setting.printerName)去匹配下拉项的Value字段,自动把对应的选项设为默认选中。
所以你的代码可以简化成这样,完全去掉手动设置选中状态的逻辑:
@{ var pstSelect = (SelectList)ViewData["Printerlist"]; } @Html.DropDownListFor(m => setting.printerName, pstSelect)
只要setting.printerName的值和pstSelect中某一项的Value完全匹配(注意大小写是敏感的),DropDownListFor就会自动帮你选中对应的选项。
基于指定值设置默认选中的通用方法
除了上面的模型绑定方式,还有两种常见场景的实现方式:
在Controller中构建SelectList时指定选中值
如果是在后端构建下拉列表数据源,你可以直接在创建SelectList的时候传入默认选中的Value:// 示例:构造打印机列表 var printerOptions = new List<SelectListItem> { new SelectListItem { Text = "办公室打印机", Value = "OfficePrinter" }, new SelectListItem { Text = "仓库打印机", Value = "WarehousePrinter" } }; // 第四个参数就是要默认选中的Value值 ViewData["Printerlist"] = new SelectList(printerOptions, "Value", "Text", setting.printerName);这样传到视图后,直接用
DropDownListFor渲染即可,无需额外处理。视图中手动调整选中项(不推荐)
如果你确实需要在视图中临时修改选中状态,可以先把SelectList的Items转换成List<SelectListItem>,再使用ForEach:@{ var printerItems = ((SelectList)ViewData["Printerlist"]).Items.Cast<SelectListItem>().ToList(); printerItems.ForEach(item => item.Selected = (item.Value == setting.printerName)); } @Html.DropDownListFor(m => setting.printerName, printerItems)但这种方式属于冗余操作,因为模型绑定已经能自动完成这个工作,除非特殊情况,否则不建议这么做。
内容的提问来源于stack exchange,提问作者omini data

