.NET Core中如何在Edit动作中显示带选中值的下拉列表?
解决方案
1. 修正控制器代码
你当前的问题有两个核心:
- SelectList未指定值字段和显示文本字段,导致下拉框展示对象的类名而非项目名称
- 数据源错误地只取了当前缺陷对应的单个项目,下拉框应该展示所有可选项目,再选中当前项
修改后的控制器代码:
public IActionResult Edit(int id) { // 获取当前要编辑的缺陷实体 var defect = db.Defects.Find(id); if (defect == null) { return NotFound(); } // 从Projects表获取所有可选项目(如果没有单独的Projects表,可改为从Defects中去重获取项目列表) var allProjects = db.Projects.Select(p => new { p.ProjectId, p.ProjectName }).ToList(); // 创建SelectList:指定数据源、值字段、显示文本字段、默认选中值 ViewBag.ProjectList = new SelectList(allProjects, "ProjectId", "ProjectName", defect.ProjectId); return View(defect); }
2. 修正视图代码
需要用asp-for绑定模型的ProjectId属性,这样框架会自动匹配SelectList中的选中值,同时asp-items指向我们修正后的ViewBag集合:
<select asp-for="ProjectId" asp-items="@ViewBag.ProjectList" class="form-control"> <option value="">请选择项目</option> <!-- 可选:添加默认提示项 --> </select>
关键说明
SelectList的四个参数:数据源、Value字段名、Text字段名、选中值,这四个参数缺一不可,才能正确生成带选中状态的下拉选项asp-for必须绑定模型的值类型属性(比如ProjectId),而不是ProjectName,这样才能和SelectList的Value字段匹配,实现自动选中- 如果没有单独的
Projects表,可将获取数据源的代码改为:var allProjects = db.Defects .Select(d => new { d.ProjectId, d.ProjectName }) .Distinct() .ToList();
内容的提问来源于stack exchange,提问作者Rezo
相关产品推荐
相关产品推荐

