2016-03-13 54 views
3

我一直在下面的教程this這表明你如何填充一個下拉列表。但是我創建頁面不顯示一個下拉列表中所有,但顯示了這個MVC實體框架我的DropDownList不是一個下拉列表

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); 
} 

瀏覽\用戶\創建.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

將其更改爲'@ Html.DropDownListFor(M => m.AdministratorID,(的SelectList)ViewBag.AdministratorList)' - 不是你需要改變'ViewBag'屬性的名稱 - 它不能是相同的名稱屬性的結合。 –

+1

'@ Html.DropDownListFor(型號=> model.AdministratorID,(的SelectList)ViewBag.AdministratorID)' –

+1

還請注意,沒有一點的'SelectList'構造函數添加的最後一個參數('selectedAdministrator') - 由它忽略綁定到模型屬性時的HtmlHelper。 –

回答

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,您將注意到<select>標籤中沒有data-val-*屬性)。相反,使用

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

,改變你的ViewBag屬性的名稱(不能是相同的名稱綁定到該屬性)

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

這是因爲他們通常會用黃色突出顯示需要更改代碼的代碼,但他們沒有爲該部分執行代碼。 – TykiMikk

+0

@JasonWan,這似乎是一個有效的聲明給予imgs。 – ChiefTwoPencils

+0

@StephenMuecke我不介意你用你的強類型版本發表評論。當然,我不希望我的編碼不好。 '@ H​​tml.DropDownListFor(m => m.AdministratorID,(SelectList)ViewBag.AdministratorList)'強類型? – TykiMikk