32

Me estoy totalmente perdido y confundido sobre cómo utilizar el nuevo ayudante Html.DropDownListFor inflexible sobre ASP.NET MVC 2.0 R2ASP.NET MVC 2 - Html.DropDownListFor confusión con el modelo de vista

En la vista de lo 'm ESCRITURA:

<%= Html.DropDownListFor(m => m.ParentCategory, new SelectList(Model.Categories, "CategoryId", "Name", Model.ParentCategory), "[ None ]")%> 

<%= Html.ValidationMessageFor(m => m.ParentCategory)%> 

y mi objetivo es, pues, Modelo:

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, dice el primer artículo, me sale el siguiente Valida tionMessageFor error "El valor '1' no es válido."

Por lo tanto, cambiar 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ía mejor que solo tuviera una int nullable para la propiedad ParentCategory en lugar de un objeto 'Category' fuertemente tipado?

+0

Se trata de una buena forma para el usuario DropDownListFor - http://stackoverflow.com/questions/3386998/dropdownlistfor-display-a-simple-list-of-strings – bcahill

Respuesta

29

También estaba experimentando el mismo problema.

Cuando depurar la acción y mirar el ModelState.Values ​​[1] .Errors [0] .Exception por ejemplo, I ver lo siguiente:

{ "La conversión de parámetros de 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 tipo puede convertir entre 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 vista:

<%=Html.DropDownListFor(x => x.MyDictionary, 
          new SelectList(
           Model.MyDictionary, 
           "Value", 
           "Key")) %> 

Cuando cambié a:

<%=Html.DropDownListFor(x => x.MyDictionary.Keys, // <-- changed to .Keys 
          new SelectList(
           Model.MyDictionary, 
           "Value", 
           "Key")) %> 

Se trabajó sin problemas.

Gracias.

9
<%= Html.DropDownListFor(m => m.ParentCategory, 
           new SelectList(
            Model.Categories, 
            "CategoryId", 
            "Name", 
            Model.ParentCategory), 
          "[ None ]")%> 

¿trató de utilizar Model.ParentCategory.CategoryId como último parámetro en SelectList y quitar [None] parámetro?

+0

no reemplazará el "[Ninguno]" con la Categoría ID solo cambiará el valor predeterminado/inicial valor de la lista desplegable y no el valor en la vista modelo en postback? Anteriormente era un voto negativo, pero lo recuperé en un ataque de incertidumbre después de darme cuenta de que probablemente haya una sobrecarga diferente. ¿Puedes aclarar un poco? –

8

Me gustaría deshacerme de

public Category ParentCategory { get; set; } 

y hacer una

public int? CategoryId { get; set; } 

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á entonces estos dos:

<%= Html.DropDownListFor(m => m.CategoryId, 
           new SelectList(
            Model.Categories, 
            "CategoryId", 
            "Name", 
            Model.CategoryId), 
           "[ None ]")%> 

<%= Html.ValidationMessageFor(m => m.CategoryId)%> 
1

Si el SelectList es nula en el modelo de vista También recibí el error anterior

Asegúrese de que el SelectList se establece

Cuestiones relacionadas