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

ASP.NET Core MVC中如何设置Html.DropDownList的选中值?

问题分析与解决方案

你的问题出在对Html.DropDownList参数的理解错误:第三个参数Model.ShortName被当成了默认占位选项的文本,导致页面加载时会在下拉列表顶部新增一个以ShortName为文本的无值选项,而非选中列表中已存在的对应项。提交表单时,这个新增选项没有绑定对应的Id值,所以会提交索引0对应的默认值(通常为空或0)。

修正方案一:正确使用Html.DropDownList

1. 调整控制器代码(设置选中值)

在创建SelectList时,直接指定选中项的Id(即模型中的OrgId):

ViewBag.orgList = new SelectList(_context.Organizations
                                         .Where(x => x.Id != 0)
                                         .OrderBy(p => p.ShortName), 
                                 "Id", "ShortName", Model.OrgId); // 最后一个参数为选中项的Id

2. 修正视图代码(移除错误的占位参数)

去掉第三个参数(如果不需要默认占位选项),或者传入空字符串/提示文本(如"请选择"):

@Html.DropDownList("OrgId", 
                   (IEnumerable<SelectListItem>)ViewBag.orgList, 
                   "", // 不需要占位则留空,或者写提示文本
                   new { @class = "form-select", @style="width:120px"})

这里"OrgId"需要和模型中的对应属性名一致,MVC会自动根据模型的OrgId值匹配下拉列表中的选项。

推荐方案二:使用强类型的Html.DropDownListFor

对于ASP.NET Core MVC,强类型辅助方法DropDownListFor是更优选择,它避免了魔法字符串,类型更安全,也更符合MVC的设计理念。

1. 确保模型包含对应属性

假设你的模型类有如下属性:

public class YourModel
{
    public int OrgId { get; set; } // 存储选中的组织Id
    public string ShortName { get; set; }
    // 其他属性...
}

2. 控制器代码保持不变(无需额外设置选中值)

ViewBag.orgList = new SelectList(_context.Organizations
                                         .Where(x => x.Id != 0)
                                         .OrderBy(p => p.ShortName), 
                                 "Id", "ShortName");

3. 视图中使用DropDownListFor

@Html.DropDownListFor(m => m.OrgId, 
                      (IEnumerable<SelectListItem>)ViewBag.orgList, 
                      "请选择", // 可选的占位提示文本
                      new { @class = "form-select", @style="width:120px"})

这个方法会自动根据Model.OrgId的值,匹配下拉列表中Value为对应Id的选项并设置为选中状态,提交表单时也会正确将选中的Id绑定到模型的OrgId属性。


内容的提问来源于stack exchange,提问作者A Cameron

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 06:42:49