为什么DropDownListFor无法选中已存在于列表中的模型绑定值?
@Html.DropDownListFor 默认选中绑定失效问题修复方案
常见原因
- 构造
SelectList时未显式指定选中值,触发了Helper的绑定优先级逻辑异常,常见触发场景如下:UserModel的Id字段类型和视图模型的UserId字段类型不匹配,比如一个是string类型、一个是int类型,即使数值一致也无法被识别为匹配项- 视图上下文存在同名的其他值,比如
ViewBag.UserId、ViewData["UserId"]、路由参数里的UserId,这些值的优先级高于模型本身的属性值,会覆盖绑定的目标值 - 该视图是通过
Partial/RenderPartial方法直接渲染的,上下文绑定链路断裂,Helper无法正常读取模型的UserId属性值 - 自定义
id属性在特殊场景下干扰了Helper的绑定匹配逻辑
解决方案
方案1(最稳妥,优先使用)
构造SelectList时显式传入第四个参数Model.UserId作为选中值,完全避开自动绑定的异常问题,修改后代码如下:
@Html.DropDownListFor(model => model.UserId, new SelectList(TempData["UserList"] as List<UserModel>, "Id", "DisplayName", Model.UserId), "Please Select", new { @class = "form-control mt-2", id = "UserId-" + Model.BusinessSurveyId + "-" + Model.SectionId })
方案2(对应类型不匹配场景)
检查UserModel.Id和视图模型UserId的类型是否完全一致,比如可空类型int?和值类型int也会导致匹配失败,调整为相同类型即可。
方案3(对应上下文值冲突场景)
清理Controller和视图中ViewData/ViewBag里的UserId同名键,或者修改路由规则避免参数名冲突即可。
内容的提问来源于stack exchange,提问作者LizardKingLK
相关产品推荐
相关产品推荐

