DropDownList 允许用户 select "Name" 但在数据库中创建 "ID"

DropDownList allow user to select "Name" but create "ID" in the DB

我正在尝试创建一个 Web 应用程序,它允许用户 select 来自 DB 的培训课程,然后 'apply' 到此课程。应用程序将登录 "CourseRequests" table.

我有一个 table 叫 "InternalCourses"
我有一个 tabled 叫 "CourseRequests"

我已经建立了一个 CREATE.CSHTML 页面,允许用户 select 一门课程,然后点击 'create' 它应该在相关 table 中创建一条记录。我的问题是因为我需要用户 select 一个课程名称,并让程序将相关 ID 发回数据库,并丢弃课程名称。 此页面的屏幕截图如下所示:

我的控制器class:

    // GET: CourseRequests/Create
    public ActionResult Create()
    {
        ViewBag.InternalCourses = db.InternalCourses.ToList();
        ViewBag.EmployeeID = new SelectList(db.Employees, "EmployeeID", "FirstName");
        ViewBag.ManagerID = new SelectList(db.Employees, "ManagerID", "FirstName");
        ViewBag.CourseID = new SelectList(db.ExternalCourses, "CourseID", "CourseName");
        ViewBag.CourseID = new SelectList(db.InternalCourses, "CourseID", "CourseName");
        ViewBag.CourseID = new SelectList(db.TrainingFeedbacks, "CourseID", "Question");
        return View();
    }

我的Create.cshtml

<!-- CourseID-->
        <div class="form-group">
            @Html.LabelFor(model => model.CourseID, "CourseID", htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownListFor(m => m.CourseID, new SelectList(ViewBag.InternalCourses, "CourseID", "CourseName"), new { @class = "form-control" } )
                @Html.ValidationMessageFor(model => model.CourseID, "", new { @class = "text-danger" })
            </div>

我的(相关)模型图: 该图像显示了一个 link 从 InternalCourse.CourseID,到 CourseRequest.CourseID 请注意 table CourseRequests,不包含 "CourseName" 只有 ID。

请有人告诉我哪里出错了,我看到我正在尝试将 CourseName 放入 ID 字段,但不知道如何更改它。

好吧,对于初学者来说,您定义了三次 ViewBag.CourseID,这完全是一种资源浪费,因为只有最后一次会坚持下去。前两个只是浪费的查询:

ViewBag.CourseID = new SelectList(db.ExternalCourses, "CourseID", "CourseName");
ViewBag.CourseID = new SelectList(db.InternalCourses, "CourseID", "CourseName");
ViewBag.CourseID = new SelectList(db.TrainingFeedbacks, "CourseID", "Question");

接下来,当使用 ViewBag 存储您的 select 列表时,您需要注意不要破坏任何模型数据。 ModelState 中的任何内容(ViewBag 是其中的一部分)都会覆盖模型中的任何内容。因此,当您将 select 列表存储在 ViewBag.CourseID 中时,您将永远无法显示 属性 CourseID 的 selected 值,因为值将始终是 select 列表本身,而不是 selected 的项目。使用不同的名称,例如 ViewBag.CourseChoices.

最后,我不确定您实际遇到的问题是什么。在 select 列表中将一件事显示为选项并不困难,例如名称,同时提交其他东西,例如 ID。 SelectList 的构造函数应按以下格式调用:

new SelectList(listOfItems, propertyToUseAsValue, propertyToUseAsText)

因此,在您的场景中,只要您按 "CourseID" 和 "CourseName" 的顺序喂它,您就会得到想要的东西。我提到的其他一些问题可能实际上是您问题的根源。