带有实体框架的MVC我的DropDownList不是下拉列表

时间:2016-03-13 04:22:27

标签: c# html asp.net-mvc entity-framework

我一直在关注this教程,该教程向您展示如何填充下拉列表。但是,我的创建页面根本没有显示下拉列表,但显示了此

enter image description here

这是我的UserController.cs中的下拉列表代码

private void PopulateAdministratorsDropDownList(object selectedAdministrator = null)
{
    var administratorQuery = from d in db.Administrators
                           orderby d.AdministratorTitle
                             select d;
    ViewBag.AdministratorID = new SelectList(administratorQuery, "AdministratorID", "AdministratorTitle", selectedAdministrator);
}

视图\用户\ Create.cshtml

@model RecreationalServicesTicketingSystem.Models.User
....
@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>User</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.LastName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.LastName)
            @Html.ValidationMessageFor(model => model.LastName)
        </div>
        .... // more controls
        <div class="editor-label">
            @Html.LabelFor(model => model.AdministratorID)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.AdministratorID)
            @Html.ValidationMessageFor(model => model.AdministratorID)
        </div>
        ....
        <p>
            <input type="submit" value="Create" />
        </p>

    </fieldset>
}

UserController.cs

public ActionResult Create()
{
    PopulateAdministratorsDropDownList();
    return View();
}

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "LastName, FirstMidName, EnrollmentDate,AdministratorID, DepartmentID, DepotID")]User user)
{
    try
    {
        if (ModelState.IsValid)
        {
            db.Users.Add(user);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
    }
    catch (DataException /* dex */)
    {
        ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists see your system administrator.");
    }
    PopulateAdministratorsDropDownList(user.AdministratorID);
    return View(user);
}

private void PopulateAdministratorsDropDownList(object selectedAdministrator = null)
{
    var administratorQuery = from d in db.Administrators
                             orderby d.AdministratorTitle
                             select d;
    ViewBag.AdministratorID = new SelectList(administratorQuery, "AdministratorID", "AdministratorTitle", selectedAdministrator);
}

1 个答案:

答案 0 :(得分:3)

你说你跟着啧啧,但你并没有完全遵循它。而是在想要下拉列表时使用@Html.DropDownListFor

在您发布的链接中,他们使用以下内容进行Department下拉列表;像这样:

<div class="editor-label">
    @Html.LabelFor(model => model.DepartmentID, "Department")
</div>
<div class="editor-field">
    @Html.DropDownList("DepartmentID", String.Empty)
    @Html.ValidationMessageFor(model => model.DepartmentID)
</div>

但你的看起来像是:

<div class="editor-label">
    @Html.LabelFor(model => model.AdministratorID)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.AdministratorID)
    @Html.ValidationMessageFor(model => model.AdministratorID)
</div>

他们不等同。

附注:您所遵循的教程未遵循最佳做法(使用强类型DropDownListFor()方法),并且使用DropDownList()也意味着您未获得任何客户端验证(如果您检查生成的html,您会注意到data-val-*标记中没有<select>个属性。相反,使用

@Html.DropDownListFor(m => m.AdministratorID, (SelectList)ViewBag.AdministratorList, "Please select")

并更改ViewBag属性的名称(它不能与您绑定的属性名称相同)

ViewBag.AdministratorList = new SelectList(administratorQuery, "AdministratorID", "AdministratorTitle")