Używam ASP.NET MVC 3, i po prostu uruchomiłem "gotcha" przy użyciu pomocnika HTML DropDownListFor
.ASP.NET MVC DropDownListFor nie wybierając wartości z modelu
zrobić to w moim kontrolera:
ViewBag.ShippingTypes = this.SelectListDataRepository.GetShippingTypes();
i metoda GetShippingTypes
:
public SelectList GetShippingTypes()
{
List<ShippingTypeDto> shippingTypes = this._orderService.GetShippingTypes();
return new SelectList(shippingTypes, "Id", "Name");
}
Przyczyny I umieścić go w ViewBag
a nie w modelu (mam silnie typami modeli każdy widok), jest to, że mam kolekcję elementów, które renderuje przy użyciu EditorTemplate, który również musi uzyskać dostęp do listy wyboru ShippingTypes.
W przeciwnym razie muszę przechodzić przez całą kolekcję i przypisać właściwość ShippingTypes.
Jak dotąd tak dobrze.
Moim zdaniem to zrobić:
@Html.DropDownListFor(m => m.RequiredShippingTypeId, ViewBag.ShippingTypes as SelectList)
(RequiredShippingTypeId
jest typu Int32
)
Co się dzieje, że wartość RequiredShippingTypeId
jest nie wybrany w rozwijanym.
Sugeruje on, że MVC będzie odnośnika wybraną wartość od ViewData
, gdy lista wyboru jest od ViewData
. Nie jestem pewien, czy tak już jest, ponieważ post na blogu jest stary, a on mówi o MVC 1 beta.
Rozwiązaniem, które rozwiązuje ten problem jest taki:
@Html.DropDownListFor(m => m.RequiredShippingTypeId, new SelectList(ViewBag.ShippingTypes as IEnumerable<SelectListItem>, "Value", "Text", Model.RequiredShippingTypeId.ToString()))
nie próbował ToString
na RequiredShippingTypeId
na końcu, co daje mi takie samo zachowanie jak przed: Brak wybranego elementu.
Myślę, że to jest problem z typem danych. Ostatecznie pomocnik HTML porównuje łańcuchy znaków (na liście wyboru) z Int32
(od RequiredShippingTypeId
).
Ale dlaczego to nie działa, gdy oddanie SelectList w ViewBag
- kiedy to działa doskonale podczas dodawania go do modelu, a robi to w środku zdania:
@Html.DropDownListFor(m => m.Product.RequiredShippingTypeId, Model.ShippingTypes)
Dzięki za obejście! Nie jest więc oczywiste, że magia działa tylko z "prostymi" wyrażeń lambda, a system nie ostrzega o tym. –