两段相同的@Html.DropDownList渲染不同HTML,首个始终返回默认值
解决@Html.DropDownList始终返回默认值的问题
先把你提到的代码片段整理补全:
<div class="form-group"> @Html.LabelFor(model => model.UnidadeId, "Unidade", htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> <!-- 始终返回默认值的第一个下拉列表 --> @Html.DropDownList("UnidadeId", (SelectList)ViewBag.UnddId, htmlAttributes: new { @class = "form-control" }) <!-- 正常工作的第二个下拉列表 --> @Html.DropDownList("OtherUnidadeId", (SelectList)ViewBag.UnddId, htmlAttributes: new { @class = "form-control" }) </div> </div>
这种问题我碰到过好多次,核心出在ASP.NET MVC的模型绑定命名冲突上:
当你用@Html.DropDownList("UnidadeId", ...)时,如果你的ViewModel里刚好有一个同名的UnidadeId属性,MVC的模型绑定机制会优先读取模型原本的属性值(也就是默认值),而非你在表单中选中提交的选项值。这就导致不管你选什么,最终提交的都是初始默认值。
而第二个下拉列表用了和模型属性不重复的名称(比如OtherUnidadeId),不会触发绑定冲突,所以能正常获取选中值。
解决办法
推荐优先用强类型绑定方案,一步到位解决问题:
方案1:改用DropDownListFor(最推荐)
直接绑定到模型属性,彻底避免命名冲突:
@Html.DropDownListFor(model => model.UnidadeId, (SelectList)ViewBag.UnddId, htmlAttributes: new { @class = "form-control" })
这是MVC处理下拉列表的标准做法,它会自动匹配模型的UnidadeId属性,提交时正确获取你选中的选项值。
方案2:手动处理(仅作备选)
如果一定要用DropDownList,要么修改下拉列表的名称(别和模型属性重名),要么在POST控制器方法里手动从请求表单取值:
[HttpPost] public ActionResult YourAction(YourViewModel model) { // 手动从表单获取选中值 var selectedValue = Request.Form["UnidadeId"]; // 赋值给模型 if (!string.IsNullOrEmpty(selectedValue)) { model.UnidadeId = int.Parse(selectedValue); } // 后续业务逻辑... }
额外检查点
- 确认
ViewBag.UnddId生成的SelectList选项都有正确的Value和Text,没有值为空或重复的情况。 - 检查ViewModel的构造函数或初始化逻辑,是不是给
UnidadeId设置了固定默认值,导致提交时被覆盖。
内容的提问来源于stack exchange,提问作者Sergio Di Fiore
相关产品推荐
相关产品推荐

