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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:04:48