2016-11-10 149 views
0

我想學習MVC ASP.Net,教程中的一個步驟建議編寫以下代碼,將指定列表中的所有項目返回到允許用戶選擇所需項目的下拉列表中。@ Html.DropDownList只返回1值

基本解釋 僅下拉列表顯示返回的當前項目例如:如果網址是詳細信息/ 2 則只會在列表中返回'Pizza',而不是'MenuGroups'列表中的所有項目。 基本解釋

雖然下面的代碼確實工作在一定程度上它不工作,我在視頻中顯示的方式,我甚至爲走得更遠,要訪問的網站和複製他的原代碼,但我仍然收到不同的結果,我不能解決原因。

http://cop4834.pbworks.com/w/page/106053825/Menu%20Case%20Study%20Part%204%20-%20Generating%20a%20Javascript%20call%20from%20a%20Razor%20Object

正如你可以看到(如果你有時間看視頻演示爲3:49)返回所有菜單組,我的代碼只顯示無論是通過URL傳遞?

<dt> 
    Select a Menu Group 
    </dt> 

    <dd> 
     @Html.DropDownList("MenuGroup", new SelectList(Model.MenuGroups, 
      "MenuGroupId", "MenuGroupTitle"), 
      new { onchange = "selectMenuGroup()" }) 
    </dd> 

「MenuGroups」從模型「菜單」

public virtual List<MenuGroup> MenuGroups { get; set; } 

控制器創建的虛擬列表如下:

public ActionResult FullDetails(int? id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     Menu menu = db.Menus.Find(id); 
     if (menu == null) 
     { 
      return HttpNotFound(); 
     } 
     return View(menu); 
    } 

道歉,如果這是太長或錯過任何信息,我已經看了很多小時之前發佈,但我只能找到人說使用@ Html.DropDownListFor代替,但我已經有一個列表,所以想要使用上述方法(也可以找到ou我的錯誤)。

在此先感謝您的任何建議。

+2

如果你的下拉列表只包含1個項目,那麼'Model.MenuGroups'只包含一個項目 - 我們不知道'db.Menus.Find(id)'返回的是什麼 - 你需要調試你的代碼 –

+0

確保您從db.Menu.Find(id);中檢索的記錄包含多於1個用於「MenuGroups」屬性的項目。欣賞下拉列表。 –

+0

正如你們都建議'List'實際上只是被傳遞了1個項目(雖然生成的SQL Query返回3會讓我更加困惑!),所以我會朝着那個方向看,謝謝你的提示。 – Danny

回答

0

首先確保MenuGroups包含您所選記錄的多個項目。

那麼你可以做的是更換

public ActionResult FullDetails(int? id) 
{ 
    if (id == null) 
    { 
     return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
    } 
    Menu menu = db.Menus.Find(id); 
    if (menu == null) 
    { 
     return HttpNotFound(); 
    } 
    return View(menu); 
} 

public ActionResult FullDetails(int? id) 
{ 
    if (id == null) 
    { 
     return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
    } 
    Menu menu = db.Menus.Include(r => r.MenuGroups).FirstOrDefault(r => r.Id == id); 
    if (menu == null) 
    { 
     return HttpNotFound(); 
    } 
    return View(menu); 
} 

由於MenuGroups是導航屬性,你可以貪婪加載它通過指定Include(r => r.MenuGroups)。 AFAIK Find僅返回不包括導航屬性的實體,它不能與Include一起使用。 EF使用virtual關鍵字的原因是允許延遲加載屬性。有關更多信息,請參見Lazy Loading vs Eager Loading

+0

OP聲稱它確實包含一個元素,所以'MenuGroups'屬性必須已填充 –

+0

感謝您的回覆,不幸的是,這也不起作用,所以我明天將繼續關注它。 – Danny