ASP.NET MVC(C#)无Entity Framework下编辑模式下拉框填充方案
解决步骤
首先得先梳理下模型、控制器和视图的逻辑问题,然后一步步调整代码来实现需求:
1. 修正视图模型与实体模型
你需要确保承载数据的视图模型能正确存储部门列表,同时职位模型保留部门ID字段用于绑定选中状态:
// 视图模型:用来传递职位数据+部门列表到视图 public class DepartmentList { public PositionModel Model { get; set; } public List<DeptList> dplist { get; set; } // 改为List<DeptList>存储所有部门 } // 职位实体模型 public class PositionModel { [Display(Name = "Position")] [Required(ErrorMessage = "Position required.")] public string position { get; set; } [Display(Name = "Department")] public string dept { get; set; } public int pid { get; set; } public int did { get; set; } // 关键:存储当前职位所属的部门ID,用于下拉框选中 public string deptname { get; set; } } // 部门实体模型 public class DeptList { public int did { get; set; } public string deptname { get; set; } }
2. 修改控制器代码加载部门列表
在查询职位数据的同时,额外查询所有部门数据,填充到posmodel.dplist中:
//GET data from database public ActionResult UpdatePos(int pid) { DepartmentList posmodel = new DepartmentList(); posmodel.Model = new PositionModel(); // 先初始化职位模型 DataTable dtPosition = new DataTable(); DataTable dtDepartments = new DataTable(); using (MySqlConnection mysqlcon = new MySqlConnection(conn)) { mysqlcon.Open(); // 1. 查询当前职位的完整数据(必须包含部门ID did) string qryPosition = "SELECT id, position, department, did FROM positions WHERE id = @pid"; MySqlDataAdapter daPosition = new MySqlDataAdapter(qryPosition, mysqlcon); daPosition.SelectCommand.Parameters.AddWithValue("@pid", pid); daPosition.Fill(dtPosition); // 2. 查询所有部门数据(假设你的部门表名为departments) string qryDepartments = "SELECT did, deptname FROM departments"; MySqlDataAdapter daDepartments = new MySqlDataAdapter(qryDepartments, mysqlcon); daDepartments.Fill(dtDepartments); } if (dtPosition.Rows.Count == 1) { // 填充当前职位数据 posmodel.Model.pid = Convert.ToInt32(dtPosition.Rows[0]["id"]); posmodel.Model.position = dtPosition.Rows[0]["position"].ToString(); posmodel.Model.did = Convert.ToInt32(dtPosition.Rows[0]["did"]); // 获取职位对应的部门ID posmodel.Model.dept = dtPosition.Rows[0]["department"].ToString(); // 把部门DataTable转成List<DeptList>赋值给dplist posmodel.dplist = dtDepartments.AsEnumerable() .Select(row => new DeptList { did = Convert.ToInt32(row["did"]), deptname = row["deptname"].ToString() }) .ToList(); return View(posmodel); } else return RedirectToAction("Index"); }
3. 修正视图的下拉框绑定
下拉框需要绑定职位的did字段(用于记录用户选择的部门),而不是部门列表本身:
<div class="form-group"> @Html.LabelFor(model => model.Model.did, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> <!-- 绑定字段为职位的did,数据源是部门列表,value取did,显示文本取deptname,默认选中当前职位的did --> @Html.DropDownListFor(model => model.Model.did, new SelectList(Model.dplist, "did", "deptname", Model.Model.did), "请选择部门", <!-- 可选:添加默认提示选项 --> new { @class = "form-control" }) @Html.ValidationMessageFor(model => model.Model.did, "", new { @class = "text-danger" }) </div> </div>
关键注意点
- 下拉框的绑定目标是职位的部门ID(Model.Model.did),这样提交表单时才能正确获取用户选择的部门ID;
- 确保你的部门表字段和
DeptList类的属性对应,如果表字段名不同,要调整SQL语句和转换代码; - 用
AsEnumerable()+Select()手动把DataTable转成实体列表,这是不使用EF时的常规转换方式。
内容的提问来源于stack exchange,提问作者kite
相关产品推荐
相关产品推荐

