ASP.NET MVC DropDownListFor ne sélectionne pas la valeur du modèle

Je suis en utilisant ASP.NET MVC 3, et viens de tomber sur une "chasse aux sorcières" à l'aide de la DropDownListFor Helper HTML.

Je le fais dans mon Controller:

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

Et la GetShippingTypes méthode:

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

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

La raison je l'ai mis dans le ViewBag et pas dans le modèle (j'ai fortement typé modèles pour chaque vue), c'est que j'ai une collection d'éléments qui rend l'aide d'un EditorTemplate, qui a également besoin d'accéder à la ShippingTypes liste de sélection.

Sinon j'ai besoin d'une boucle sur l'ensemble de la collection, et d'attribuer un ShippingTypes de la propriété alors.

So far So good.

De mon point de vue, je fais ceci:

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

(RequiredShippingTypeId est de type Int32)

Ce qui se passe, c'est que la valeur de RequiredShippingTypeId est pas sélectionné dans le menu déroulant.

Je suis tombé sur ceci: http://web.archive.org/web/20090628135923/http://blog.benhartonline.com/post/2008/11/24/ASPNET-MVC-SelectList-selectedValue-Gotcha.aspx

Il suggère que MVC va rechercher la valeur sélectionnée de ViewDatalorsque la liste de sélection est de ViewData. Je ne suis pas sûr que c'est plus le cas aujourd'hui, puisque le blog est vieux et qu'il parle de MVC 1 bêta.

Une solution qui résout ce problème est: est-ce

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

J'ai essayé de ne pas ToString sur RequiredShippingTypeId à la fin, ce qui me donne le même comportement qu'avant: Pas de point sélectionné.

Je pense que c'est une question de type de données. En fin de compte, le helper HTML est de comparer des chaînes de caractères (dans la Liste de sélection) avec le Int32 (à partir de la RequiredShippingTypeId).

Mais pourquoi n'est-il pas de travail lors de la mise de la SelectList dans le ViewBag -- quand il fonctionne parfaitement lors de l'ajout à un modèle, et ce faisant à l'intérieur de la vue:

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

source d'informationauteur MartinHN