You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两段相同的@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:26:35