更新视图中处理带NULL ID的下拉菜单问题
解决ASP.NET MVC下拉菜单NULL值时失效的问题
问题根源在Selected = Model.CIT20.P1_ID_1 == obj.ID这个判断上——当Model.CIT20.P1_ID_1是NULL时,和非NULL的obj.ID做相等判断会返回false,导致没有任何选项被选中,连默认的"select"占位项也无法正常选中。
给你两种解决办法:
办法一:优化选中逻辑的判断
直接在判断里处理NULL的情况,先检查P1_ID_1是否有值,再做相等比较:
@Html.DropDownList("P1_ID_1", Model.dropDown_1.Select(obj => new SelectListItem() { Text = obj.description, Value = obj.ID.ToString(), Selected = Model.CIT20.P1_ID_1.HasValue && Model.CIT20.P1_ID_1.Value == obj.ID }), "select")
这样当P1_ID_1为NULL时,所有选项的Selected都会是false,下拉菜单就会自动选中默认的"select"占位项。
办法二:用强类型的DropDownListFor(更推荐)
强类型的DropDownListFor会自动处理模型里的NULL值,不用手动设置Selected属性,代码更简洁还不容易出错:
先确认你的模型中P1_ID_1是可空类型(比如int?),然后替换成下面的代码:
@Html.DropDownListFor(m => m.CIT20.P1_ID_1, Model.dropDown_1.Select(obj => new SelectListItem() { Text = obj.description, Value = obj.ID.ToString() }), "select")
DropDownListFor会自动根据Model.CIT20.P1_ID_1的值匹配对应选项,要是值为NULL,就自动选中默认的"select"占位项,完全不用手动处理选中逻辑。
额外提醒
- 第一种办法适合你不想改强类型辅助方法的场景,核心就是避免NULL直接参与相等比较;
- 第二种是ASP.NET MVC的最佳实践,强类型绑定能减少手动逻辑的错误,后续维护也更方便。
内容的提问来源于stack exchange,提问作者rikymao
相关产品推荐
相关产品推荐

