Yo estoy totalmente perdido y confundido sobre cómo utilizar el nuevo establecimiento inflexible de tipos de Html.DropDownListFor ayudante en ASP.NET MVC 2.0 R2

En el punto de 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 Modelo de objetos 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 al seleccionar un elemento de la lista desplegable, dicen que el primer elemento, me sale el siguiente ValidationMessageFor de error «El valor ‘1’ no es válida.»

Así que me cambie la Vista a…

<%= Html.DropDownListFor(m => m.ParentCategory.**CategoryId**, 
                              new SelectList .../ snip  ) %>

Ahora funciona, un poco. El ParentCategory propiedad en mi ViewModel se establece con el correcto «CategoryId» pero el ‘Nombre’ es NULO. Estoy mejor solo tener que acepta valores null int para ParentCategory de propiedad en lugar de un inflexible ‘Categoría’ objeto?

4 Comentarios

  1. 29

    Yo también estaba experimentando el mismo problema.

    Cuando me depuración de la Acción y la mirada en el ModelState.Valores[1].Errores[0].Excepción por ejemplo, yo veo las siguientes:

    {«El parámetro de conversión de tipo ‘System.Cadena’ a ‘tipo de Sistema.Las colecciones.Genérica.KeyValuePair`2[[Sistema.Cadena, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[Sistema.Int64, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]’ no se pudo porque no hay ningún tipo de convertidor puede convertir entre los siguientes tipos.»} Sistema.Exception {Sistema.InvalidOperationException}

    En mi escenario, mi SelectList se crea a partir de un Diccionario y la uso en mi punto de vista:

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

    Cuando he cambiado a:

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

    Funcionó sin problemas.

    Gracias.

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

    Hizo intenta utilizar Model.ParentCategory.CategoryId como último parámetro en SelectList
    y quitar [None] parámetro?

    • no sustituir el «[ Ninguno ]» con el CategoryId sólo cambiar el valor predeterminado inicial/valor de la lista desplegable y no el valor en el viewmodel en la devolución de datos? Antes era un downvote pero yo la saqué en un ajuste de incertidumbre después de darse cuenta que es probable que exista una diferente de la sobrecarga. Puedes aclarar un poco?
  3. 8

    Yo me desharía de

    public Category ParentCategory { get; set; }

    y hacer un

    public int? CategoryId { get; set; }

    lugar. Usted probablemente sólo necesitará el Id de todos modos – siempre se puede buscar el objeto real mediante el Id como clave (utilizando linq/lambda en su lista en su caso).

    La vista luego de tener estos dos:

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

    Si el SelectList es nulo en el ViewModel también he recibido el error anterior

    Asegúrese de que el SelectList se establece

Dejar respuesta

Please enter your comment!
Please enter your name here