ASP.NET MVC DropDownListPara não selecionar valor do modelo
Eu estou usando o asp.net MVC 3, e apenas corri para um 'gotcha' usando oDropDownListFor
Auxiliar de HTML.
Eu faço isso no meu controlador:
ViewBag.ShippingTypes = this.SelectListDataRepository.GetShippingTypes();
E aGetShippingTypes
método:
public SelectList GetShippingTypes()
{
List<ShippingTypeDto> shippingTypes = this._orderService.GetShippingTypes();
return new SelectList(shippingTypes, "Id", "Name");
}
A razão pela qual eu coloquei noViewBag
e não no modelo (tipifiquei fortemente modelos para cada visualização), é que tenho uma coleção de itens que renderiza usando um EditorTemplate, que também precisa acessar a lista de seleção ShippingTypes.
Caso contrário, preciso percorrer toda a coleção e atribuir uma propriedade ShippingTypes.
Por enquanto, tudo bem.
Na minha opinião, faço isso:
@Html.DropDownListFor(m => m.RequiredShippingTypeId, ViewBag.ShippingTypes as SelectList)
(RequiredShippingTypeId
é do tipoInt32
)
O que acontece é que o valor deRequiredShippingTypeId
énão selecionado no menu suspenso.
Eu me deparei com isso:http://web.archive.org/web/20090628135923/http://blog.benhartonline.com/post/2008/11/24/ASPNET-MVC-SelectList-selectedValue-Gotcha.aspx
Ele sugere que o MVC procurará o valor selecionado deViewData
, quando a lista de seleção é deViewData
. Eu não tenho certeza se este é o caso mais, já que o post do blog é antigo e ele está falando sobre o MVC 1 beta.
Uma solução alternativa que resolve esse problema é esta:
@Html.DropDownListFor(m => m.RequiredShippingTypeId, new SelectList(ViewBag.ShippingTypes as IEnumerable<SelectListItem>, "Value", "Text", Model.RequiredShippingTypeId.ToString()))
Eu tentei nãoToString
emRequiredShippingTypeId
no final, o que me dá o mesmo comportamento de antes: Nenhum item selecionado.
Eu estou pensando que isso é um problema de tipo de dados. Por fim, o auxiliar de HTML está comparando strings (na Select List) com oInt32
(deRequiredShippingTypeId
).
Mas por que não funciona ao colocar o SelectList noViewBag
- quando funciona perfeitamente ao adicioná-lo a um modelo e fazer isso dentro da visão:
@Html.DropDownListFor(m => m.Product.RequiredShippingTypeId, Model.ShippingTypes)