2016-11-10 2 views
0

Ich versuche MVC ASP.Net zu lernen, ein Schritt in der Anleitung rät, den folgenden Code zu schreiben, um alle Elemente in der angegebenen Liste zu einem Dropdown-Menü zurückgeben, damit der Benutzer das gewünschte Element auswählen kann .@ Html.DropDownList gibt nur 1 Wert zurück

Grundlegende Erklärung Dropdown-Liste zeigt nur das aktuelle Element, das z. Wenn die URL Details ist/2 wird nur 'Pizza' in der Liste zurückgegeben und nicht alle Elemente in der 'MenuGroups' Liste. grundlegende Erklärung

Obwohl Sie den Code unten in einem Ausmaß, funktioniert es nicht die Art und Weise funktioniert ich in dem Video zu sehen bin, habe ich sogar so weit gehen auf die Website und das Kopieren seiner genauen Code, aber ich immer noch verschwunden erhalten unterschiedliche Ergebnisse und ich kann nicht herausfinden warum.

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

Wie Sie sehen können (Wenn Sie Zeit haben, um das Video der Demonstration um 3:49 ist zu sehen) alle Menü Gruppen zurückgegeben, nur mein Code angezeigt werden, was auch immer wird über die URL übergeben?

<dt> 
    Select a Menu Group 
    </dt> 

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

‚MenuGroups‘ ist eine virtuelle Liste aus dem ‚Menü‘ Modell erstellt

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

Die Steuerung ist wie folgt:

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

Entschuldigt, wenn diese zu lang oder verpasst jede Informationen, die ich vor der Veröffentlichung viele Stunden lang angeschaut habe, aber ich kann nur Leute finden, die sagen, stattdessen @ Html.DropDownListFor zu verwenden, aber ich habe bereits eine Liste und möchte daher die obige Methode verwenden (und auch ou finden t mein Fehler).

Vielen Dank im Voraus für eine Beratung.

+2

Wenn die Dropdownliste nur 1 Element enthält, dann enthält 'Model.MenuGroups' nur ein Element - wir wissen nicht, was' db.Menus.Find (id) 'zurückgibt - Sie müssen Ihren Code debuggen –

+0

Stellen Sie sicher, dass Der Datensatz, den Sie aus der 'db.Menu.Find (id);} abrufen, enthält mehr als 1 Eintrag für die Eigenschaft' MenuGroups'. Um die Dropdown-Liste zu schätzen. –

+0

Wie Sie beide vorgeschlagen haben, wird die 'Liste' tatsächlich nur 1 Element übergeben (Obwohl die generierte SQL-Abfrage 3 zurückgibt, was mich mehr verwirrt!), Werde ich stattdessen in diese Richtung schauen, danke für den Tipp. – Danny

Antwort

0

Stellen Sie zunächst sicher, dass MenuGroups mehrere Elemente für den ausgewählten Datensatz enthält.

Und was können Sie tun, ist

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

mit

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

Seit MenuGroups ersetzen ist eine Navigationseigenschaft, können Sie gerne Last durch Include(r => r.MenuGroups) angeben. AFAIK Find gibt nur die Entität zurück, die die Navigationseigenschaften nicht enthält, und es ist nicht zusammen mit Include verwendbar. Der Grund, warum EF das Schlüsselwort virtual verwendet, ist das Ermöglichen des verzögerten Ladens der Eigenschaft. Weitere Informationen finden Sie unter Lazy Loading vs Eager Loading.

+0

OP behauptet, dass es ein Element enthält, so dass die 'MenuGroups' -Eigenschaft ausgefüllt worden sein muss –

+0

Danke für Ihre Antwort, leider hat das auch nicht funktioniert, also werde ich morgen weiter nachsehen. – Danny

Verwandte Themen