【问题标题】:MVC DropDownList populate from one DB table and send to another DB tableMVC DropDownList 从一个 DB 表填充并发送到另一个 DB 表
【发布时间】:2015-03-11 11:04:19
【问题描述】:

我想要一个下拉列表,它从资格表中提取数据,然后在 HttpPost 上,它将下拉列表中选择的值存储到员工表上的“资格”列中。我对 MVC 很陌生,我不太了解语法。我也不知道如何使用 jquery、vb 等。很抱歉,如果有一篇文章涵盖了这个,我没有看到它,因为我不知道我在看什么。

这是我目前最好的尝试:

控制器:

private Database1Entities db = new Database1Entities();
...
...
...
    // GET: /Home/CreateEmp
            public ActionResult CreateEmp()
            {
                ViewBag.QualList = new SelectList(db.Qualifications, "Id", "qual");
                return View();
            }
            // POST: /Home/CreateEmployee
            [HttpPost, ActionName("CreateEmployee")]
            public ActionResult CreateEmpResult(Employee emp)
            {
                if (ModelState.IsValid)
                {
                    db.Employees.Add(emp);
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
                ViewBag.QualList = new SelectList(db.Qualifications, "Id", "qual", emp.qualification);
                return View(emp);
            }

创建员工视图:

@model MvcDropDownList.Models.Employee
    @using (Html.BeginForm("CreateEmployee", "Home", FormMethod.Post))
    {
        @Html.AntiForgeryToken()
        @Html.ValidationSummary(true)
        <table>
        <!-- other fields removed for sake of simplicity -->
        <tr>
            <td>
                @Html.Label("Select Your Qualification:")
            </td>

            <td>
                @Html.DropDownList("QualList", "--Select--")
            </td>
        </tr>
    </table>
    }

表结构:

资格表:Id、qual

员工表:ID、名字、姓氏、性别、资格

我的代码成功从“资格”表中获取数据,但没有将其发布到“员工”表中的“资格”列。

任何建议将不胜感激,谢谢!

【问题讨论】:

    标签: c# asp.net-mvc model-view-controller drop-down-menu


    【解决方案1】:

    您应该将下拉列表绑定到单击“保存”按钮时返回的模型。

    换句话说,这个:

    @Html.DropDownList("QualList", "--Select--")
    

    应该变成这样:

    @Html.DropDownListFor(model => model.Qualification_Id, (SelectList)ViewBag.QualList)
    

    编辑 正如 Stephen Muecke 指出的,您需要将 Viewbag 值转换为 SelectList

    注意DropDownListFor() 有多种可能性。为了清楚起见,我只选择了最简单的一个,但您可以添加可选标签等。

    这会将其绑定到您的模型 (emp):

    public ActionResult CreateEmpResult(Employee emp)
    

    注意:如果您的 Employee 类设置正确并且具有所需的外键(链接到 Qualification 表),则应该已经有一个 .Qualification_Id(或类似名称)在您的 Employee 类(假设该类是您的实际数据库实体)。

    这些更改将涵盖您需要的一切:

    • 下拉列表现在将所选值写入emp.Qualification_Id
    • 在您的控制器方法中,您将emp 保存到数据库。
    • EF 将使用 FK 字段 (emp.Qualification_Id) 确保将正确的值写入将在数据库中创建的新员工行中。

    作为一般规则,请始终尝试将控件(下拉列表、文本框等)绑定到模型的属性。如果你这样做,你不需要编写特定的代码来做基本相同的事情。

    【讨论】:

    • 注意它必须是@Html.DropDownListFor(m =&gt; m.Qualification_Id, (SelectList)ViewBag.QualList) - 你需要转换ViewBag.QualList
    • 我认为 MVC5 解决了这个问题,但您似乎是对的。更新答案:)
    • 显然我遗漏了一些东西...我已经使用“qualId”FK 设置了员工表,并将以下代码添加到视图中:@Html.DropDownListFor(m =&gt; m.QualId, (SelectList)ViewBag.QualList) 在控制器中,发布操作有:ViewBag.QualList = new SelectList(db.Qualifications, "Id", "qual", emp.qualId); 我认为这会起作用,我错过了什么吗??
    • 另外,我有 MVC4 (Visual Studio 2013)
    • 我不确定您对 ViewBag = ... 部分的意思。设置 ViewBag 应该在 加载 创建页面(GET 请求)时在方法上完成,而不是在您从它收到 POST 时完成(到那时,用户应该已经从下拉列表中选择了正确的条目)。其次,是否在 Employee 实体中添加了 QualId 列/字段,或者您是否在实体之间添加了关系?根据您是使用 Code First、Model First 还是 DB First,您必须让 EF 根据您在两个实体之间设置的关系生成自己的 FK 字段。
    【解决方案2】:

    我不知道这是否会有所帮助,但我创建了一个模型类,它创建了多个列表,我将在整个应用程序中使用这些列表之一:-

    SKTDATABASEEntities db = new SKTDATABASEEntities(); public List
    <Department>Departments { get { return db.Departments.ToList(); } }

    我的类名是 ThingLists,然后我在我的控制器类中将其实例化为:-

    public ActionResult CreateTask() { ThingLists deps = new ThingLists(); var de = from t in deps.Departments select t.Department_Name; ViewData["depies"] = de;

    并在我的视图中显示如下:-

    <label for="Task">Department</label>
    <div class="editor-field">
      <%: Html.DropDownList( "lsttasks", new SelectList((IEnumerable)ViewData[ "depies"], "Department"), new { id="drop1" })%>
        <br />
    </div>

    这在显示我的下拉列表时非常有效,有人建议我使用 javascript 来分配所选项目,例如:-

      < script type = "text/javascript" >
        function onSelectedIndexChanged(select) {
          var text = $("drop1").valueOf();
          document.getElementById('drop1').innerHTML = text;
        } < /script>

    在那部分我仍然在我的控制器中得到空值,也许你可以从那里到达某个地方。 :-) 我还在等待我的问题的回复,但如果有人回复我会与你分享。

    【讨论】:

    • 对不起,忽略我的回答,它甚至不是一个答案@stephen 的回答完美我刚刚尝试过谢谢:-) 我欠你的!!!!
    【解决方案3】:

    @oli_taz 使用我上面的代码和 viewdata 而不是 viewbag 我只需要将我的视图修改为

    &lt;%: Html.DropDownListFor(model=&gt;model.Department,new SelectList((IEnumerable)ViewData["depies"], "Department")) %&gt;

    它从数据库表“departments”中获取值并填充在thinglists.cs 中创建的列表,当我保存它时,它会将我选择的值准确地保存到我的“tasks”表中。我希望我解释得足够清楚,我有点新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多