.NET MVC Razor中For循环下DropDownListFor值匹配问题咨询
问题原因
- 深层嵌套属性的下拉选中值自动匹配失效:
DropDownListFor对多层List嵌套的复杂属性路径(menu_obj.menus[i].content[j].type),无法自动读取属性值作为默认选中项,而TextBoxFor仅需渲染属性值无需匹配选项,所以可以正常绑定。 - 下拉列表未指定选中值:你的
subType()方法返回的SelectList没有传入当前项的选中值,默认会选中第一个选项,不会主动匹配属性值。 - (可选)值匹配规则严格:如果你的JSON反序列化得到的
type值和下拉选项的Value存在大小写、前后空格差异,也会导致匹配失败。
解决方案
方案1:构造SelectList时手动传入当前选中值
修改视图中下拉框的代码,直接将当前子项的type作为选中值传入SelectList构造函数:
@Html.TextBoxFor(p => p.menu_obj.menus[i].content[j].type) @* 手动指定选中值为当前子项的type *@ @Html.DropDownListFor(p => p.menu_obj.menus[i].content[j].type, new SelectList(ModelSelectList.subType().Items, "Value", "Text", Model.menu_obj.menus[i].content[j].type))
也可以直接修改subType方法,支持传入选中值参数,调用更简洁:
public static SelectList subType(string selectedVal = null) { List<SelectListItem> itemList = new List<SelectListItem> { new SelectListItem{ Value = "speaking", Text = "speaking"}, new SelectListItem{ Value = "words", Text = "words"}, new SelectListItem{ Value = "game", Text = "game"} }; return new SelectList(itemList, "Value", "Text", selectedVal); }
视图中调用时传入当前值即可:
@Html.DropDownListFor(p => p.menu_obj.menus[i].content[j].type, ModelSelectList.subType(Model.menu_obj.menus[i].content[j].type))
方案2:显式指定下拉框name属性(极端情况适配)
如果上述方案仍未生效,可以手动指定下拉框的name属性和TextBoxFor生成的name保持一致,确保提交后绑定正常:
@Html.DropDownListFor(p => p.menu_obj.menus[i].content[j].type, ModelSelectList.subType(Model.menu_obj.menus[i].content[j].type), new { @Name = Html.NameFor(p => p.menu_obj.menus[i].content[j].type) })
后续动态增删功能注意事项
你后续要实现父节点、子节点的动态新增/删除功能时,需要注意维护嵌套索引i和j的连续性,不要出现断号,否则表单提交时MVC默认的集合绑定逻辑会丢失索引不连续的项。
内容的提问来源于stack exchange,提问作者Rick
相关产品推荐
相关产品推荐

