ASP.NET MVC DropDownListFor wählt keinen Wert aus dem Modell aus

Ich verwende ASP.NET MVC 3 und bin gerade mit dem auf ein 'gotcha' gestoßenDropDownListFor HTML-Helfer.

Ich mache das in meinem Controller:

ViewBag.ShippingTypes = this.SelectListDataRepository.GetShippingTypes();

Und dasGetShippingTypes Methode:

public SelectList GetShippingTypes()
{
    List<ShippingTypeDto> shippingTypes = this._orderService.GetShippingTypes();

    return new SelectList(shippingTypes, "Id", "Name");
}

Der Grund, warum ich es in dieViewBag und nicht im Modell (ich habe stark typisierte Modelle für jede Ansicht), ist, dass ich eine Sammlung von Elementen habe, die unter Verwendung einer Editor-Vorlage gerendert werden, die auch auf die Auswahlliste "Versandarten" zugreifen muss.

Ansonsten muss ich die gesamte Sammlung durchlaufen und dann eine ShippingTypes-Eigenschaft zuweisen.

So weit, ist es gut.

Meiner Meinung nach mache ich Folgendes:

@Html.DropDownListFor(m => m.RequiredShippingTypeId, ViewBag.ShippingTypes as SelectList)

(RequiredShippingTypeId ist vom TypInt32)

Was passiert ist, dass der Wert vonRequiredShippingTypeId istnicht in der Dropdown-Liste ausgewählt.

Ich bin auf folgendes gestoßen:http://web.archive.org/web/20090628135923/http://blog.benhartonline.com/post/2008/11/24/ASPNET-MVC-SelectList-selectedValue-Gotcha.aspx

Er schlägt vor, dass MVC den ausgewählten Wert von nachschlägtViewData, wenn die Auswahlliste von stammtViewData. Ich bin mir nicht mehr sicher, ob dies der Fall ist, da der Blog-Beitrag alt ist und er über MVC 1 Beta spricht.

Eine Problemumgehung, die dieses Problem behebt, lautet wie folgt:

@Html.DropDownListFor(m => m.RequiredShippingTypeId, new SelectList(ViewBag.ShippingTypes as IEnumerable<SelectListItem>, "Value", "Text", Model.RequiredShippingTypeId.ToString()))

Ich habe versucht, es nicht zu tunToString aufRequiredShippingTypeId am ende, was mir das selbe verhalten gibt wie vorher: Kein artikel ausgewählt.

Ich denke, das ist ein Datentyp-Problem. Letztendlich vergleicht der HTML-Helfer Strings (in der Auswahlliste) mit demInt32 (von demRequiredShippingTypeId).

Aber warum funktioniert es nicht, wenn die SelectList in dieViewBag - Wenn es beim Hinzufügen zu einem Modell einwandfrei funktioniert und dies in der Ansicht geschieht:

@Html.DropDownListFor(m => m.Product.RequiredShippingTypeId, Model.ShippingTypes)

Antworten auf die Frage(5)

Ihre Antwort auf die Frage