sintaxis - ASP.NET MVC 2-Html.DropDownListFor confusión con ViewModel
html.dropdownlistfor asp mvc (4)
Me desharía de
public Category ParentCategory { get; set; }
y hacer una
public int? CategoryId { get; set; }
en lugar. Probablemente solo necesites el Id de todos modos: siempre puedes buscar el objeto real usando el Id como clave (usando un linq / lambda en tu lista en tu caso).
La vista tendrá estos dos:
<%= Html.DropDownListFor(m => m.CategoryId,
new SelectList(
Model.Categories,
"CategoryId",
"Name",
Model.CategoryId),
"[ None ]")%>
<%= Html.ValidationMessageFor(m => m.CategoryId)%>
Estoy totalmente perdido y confundido sobre cómo usar el nuevo Html.DropDownListFor helper con mecanografía fuerte en ASP.NET MVC 2.0 R2
En la vista que estoy escribiendo:
<%= Html.DropDownListFor(m => m.ParentCategory, new SelectList(Model.Categories, "CategoryId", "Name", Model.ParentCategory), "[ None ]")%>
<%= Html.ValidationMessageFor(m => m.ParentCategory)%>
y mi objeto Modelo es así:
public class CategoryForm : FormModelBase
{
public CategoryForm()
{
Categories = new List<Category>();
Categories.Add(new CategoryForm.Category() {
CategoryId = 1,
Name = "CPUs" });
Categories.Add(new CategoryForm.Category() {
CategoryId = 2,
Name = "Memory" });
Categories.Add(new CategoryForm.Category() {
CategoryId = 3,
Name = "Hard drives" });
}
// ...other props, snip... //
public Category ParentCategory { get; set; }
public IList<Category> Categories { get; protected set; }
public class Category
{
public int? CategoryId { get; set; }
public string Name { get; set; }
}
}
El problema es que cuando selecciono un elemento de la lista desplegable, por ejemplo, el primer elemento, obtengo el siguiente ValidationMessageFor error "El valor ''1'' no es válido."
Así que cambio la Vista a ...
<%= Html.DropDownListFor(m => m.ParentCategory.**CategoryId**,
new SelectList .../ snip ) %>
Ahora funciona, un poco. La propiedad ParentCategory en mi ViewModel se establece con la correcta ''CategoryId'' pero el ''Name'' es NULL. ¿Será mejor que solo tenga un int nullable para la propiedad ParentCategory en lugar de un objeto de "Categoría" fuertemente tipado?
Si SelectList es nulo en ViewModel, también recibí el error anterior
Asegúrese de que la lista de selección esté configurada
También estaba experimentando el mismo problema.
Cuando depuro la Acción y miro en el ModelState.Values [1] .Errors [0] .Exception por ejemplo, veo lo siguiente:
{"La conversión de parámetros del tipo ''System.String'' para escribir ''System.Collections.Generic.KeyValuePair`2 [[System.String, mscorlib, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089], [System. Int64, mscorlib, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089]] ''falló porque ningún convertidor de tipos puede convertir estos tipos. "} System.Exception {System.InvalidOperationException}
En mi caso, mi lista de selección se crea a partir de un diccionario y la utilizo en mi opinión:
<%=Html.DropDownListFor(x => x.MyDictionary,
new SelectList(
Model.MyDictionary,
"Value",
"Key")) %>
Cuando lo cambié a:
<%=Html.DropDownListFor(x => x.MyDictionary.Keys, // <-- changed to .Keys
new SelectList(
Model.MyDictionary,
"Value",
"Key")) %>
Funcionó sin problemas.
Gracias.
<%= Html.DropDownListFor(m => m.ParentCategory,
new SelectList(
Model.Categories,
"CategoryId",
"Name",
Model.ParentCategory),
"[ None ]")%>
¿ Model.ParentCategory.CategoryId
utilizar Model.ParentCategory.CategoryId
como último parámetro en SelectList
y eliminar el parámetro [None]
?