MVC框架下Html.Grid表格内下拉框无法回显已保存选中值求助
问题排查与修复方案
核心问题1:控制器ViewBag赋值逻辑错误
你当前的GET请求Index方法中存在两处致命逻辑错误:
- 遍历数据列表的循环中直接return,仅循环了第一条数据就返回了视图,ViewBag.EmpList永远是第一条数据处理后的结果
- 当用户存在已保存的状态时,你将ViewBag.EmpList赋值为单个字符串值,而非下拉框需要的状态集合,导致后续构造SelectList时数据源完全错误
修正后的控制器代码
public ActionResult Index() { try { // 统一加载所有可用的状态集合,全局共用,仅查询一次 ViewBag.EmpList = dbContext.MVP_CurrentStatus.Where(x => x.isActive == true) .OrderBy(x => x.MVPCurrentStatus) .ToList(); var search = dbContext.OP_Admin_MVP_TrackingApp.ToList(); return View(search); } catch (DbEntityValidationException e) { foreach (var validationErrors in e.EntityValidationErrors) { foreach (var validationError in validationErrors.ValidationErrors) { Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); } } Session["Error"] = e.InnerException + " ---- " + e.Message; } return View(); }
核心问题2:DropDownList参数优先级问题
MVC的Html.DropDownList第一个参数为表单字段名,HtmlHelper会优先尝试从ViewData/Model中查找该名称对应的值作为选中项,优先级高于你传入的selectedValue参数。你传了固定字符串Select Current Status,系统找不到匹配值就会默认选中第一个选项。
修正后的视图下拉框代码
x.Add().Titled("Current Status").Encoded(false).SetWidth(1).Sanitized(false).Filterable(true) .RenderValueAs(y => @Html.DropDownList( $"CurrentStatus_{y.EmpID}", // 字段名和id保持一致,避免全局匹配 new SelectList(ViewBag.EmpList, "MVPCurrentStatus", "MVPCurrentStatus", y.OP_CurrentStatus), new { style = "width: 100px;", @class = "form-control", @id = "CurrentStatus_" + y.EmpID } ));
额外注意事项
确保y.OP_CurrentStatus的类型和MVP_CurrentStatus实体中MVPCurrentStatus的类型完全一致,比如一个是int一个是string的情况下,哪怕值相等也不会触发选中。
内容的提问来源于stack exchange,提问作者Unexpected_error
相关产品推荐
相关产品推荐

