2016-05-09 6 views
0

Ich weiß nicht, warum mein Modell nicht korrekt an eine Drop-down-Liste bindet, ich habe das an einigen anderen Stellen erfolgreich gemacht, aber es gibt keinen Erfolg. Dies ist für einen Einkaufswagen, wollen nur eine Menge Dropdown-Liste, die den Warenkorb aktualisiert, und zeigen Sie die aktuelle Menge aus der Datenbank.MVC5 Model Binding to DropDownList

Modell:

public class CartViewModel 
{ 
    public List<CategoryModel> Categories { get; set; } 
    public CartModel Cart { get; set; } 
    public IEnumerable<SelectListItem> Quantities { get; set; } 
} 

    public class CartModel 
{ 
    public List<CartItem> Items { get; set; } 
} 

public class CartItem 
{ 
    public int ProductId { get; set; } 
    public string Name { get; set; } 
    public int Quantity { get; set; } 
    public float Price { get; set; } 
    public float TotalPrice { get; set; } 
    public string ImageName { get; set; } 
} 

Klasse für Mengen, 0-10

public class QuantityList 
{ 
    public static IEnumerable<SelectListItem> QtyList = new List<SelectListItem>() 
    { 
     new SelectListItem() {Text="0", Value="0" }, 
     new SelectListItem() {Text="1", Value="1" }, 
     new SelectListItem() {Text="2", Value="2" }, 
     new SelectListItem() {Text="3", Value="3" }, 
     new SelectListItem() {Text="4", Value="4" }, 
     new SelectListItem() {Text="5", Value="5" }, 
     new SelectListItem() {Text="6", Value="6" }, 
     new SelectListItem() {Text="7", Value="7" }, 
     new SelectListItem() {Text="8", Value="8" }, 
     new SelectListItem() {Text="9", Value="9" }, 
     new SelectListItem() {Text="10", Value="10" } 
    }; 
} 

Ansicht

@using (Html.BeginForm("UpdateCart", "Cart", FormMethod.Post)) 
{ 
    for (int i = 0; i < Model.Cart.Items.Count; i++) 
    { 
     <div class="CartItem"> 
      <span class="ItemName">@Model.Cart.Items[i].Name</span> 
      **<span class="ItemQty">@Html.DropDownListFor(m => Model.Cart.Items[i].Quantity, Model.Quantities)</span>** 
      <span class="RemoveItem">@Html.ActionLink("Remove", "RemoveItem", new { ProductId = Model.Cart.Items[i].ProductId })</span> 
     </div> 
    } 

} 

aller Last und macht richtig, mit Ausnahme des Dropdownlist, habe ich auch verwendet eine TextBoxFor und es wird korrekt mit den richtigen Werten gerendert, aber nicht beim Versuch, an die vorbelegte Liste von zu binden selectlistitems

Antwort

1

Dies ist eine unglückliche Einschränkung der Verwendung DropDownListFor() innerhalb einer for Schleife (es wurde ein paar Mal auf CodePlex gemeldet). Sie müssen entweder 10 für typeof CartItem verwenden und Ihre SelectList über AdditionalViewData an diese Adresse übergeben oder in jeder Iteration eine neue SelectList generieren und die Selected-Eigenschaft festlegen.

for (int i = 0; i < Model.Cart.Items.Count; i++) 
{ 
    .... 
    @Html.DropDownListFor(m => m.Cart.Items[i].Quantity, new SelectList(Model.Quantities, "Value", "Text", Model.Cart.Items[i].Quantity) 
    .... 
} 

Beachten Sie, dass Sie Ihren Code

public class CartViewModel 
{ 
    public List<CategoryModel> Categories { get; set; } 
    public List<CartItem> Items { get; set; } 
    public int[] Quantities { get; set; } 
} 

und bevölkern die Quantitiesmodel.Quantities = Enumerable.Range(0, 10); Verwendung vereinfachen und in der Ansicht

@Html.DropDownListFor(m => m.Items[i].Quantity, new SelectList(Model.Quantities, Model.Items[i].Quantity) 
0

Anstatt die Liste der Ansichtsmodell binden, können Sie direkt auf Ihre statische Liste gehen:

@Html.DropDownListFor(m => Model.Cart.Items[i].Quantity, QuantityList.QtyList) 

Wie Sie etwas binden, die die Liste festgelegt hat. Soweit der Standard nicht funktioniert, sehe ich nicht den Code, wo die statische Variable QtyList an die Eigenschaft Quantities des Ansichtsmodells übergeben wird.

+0

ich das versucht hatte, bevor es an das Ansichtsmodell und Einstellen funktionierte nicht richtig, Stephens Antwort funktionierte wie beabsichtigt. danke für Ihre Hilfe –