Estoy utilizando el modelo de EF primer y el uso de viewmodels en MVC, tengo problemas con este error:

The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[NKI3.Models.Question]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable`1[NKI3.ViewModels.IndexCreateViewModel]'.

Este es mi viewmodel:

public class IndexCreateViewModel
{
    public string QuestionText { get; set; }
    public string Sname { get; set; }
    public string Cname {get;set;}
}

Este es mi Acción en mi controlador:

public ActionResult Index()
{
    var Q = db.Question.Include(a => a.SubjectType).Include(a => a.CoreValue);
    return View(Q.ToList());   
}

Aquí está mi establecimiento inflexible de tipos de vista:

@model IEnumerable<NKI3.ViewModels.IndexCreateViewModel>

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
    <tr>
        <th>
            QuestionText
        </th>
        <th>
            Sname
        </th>
        <th>
            Cname
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.QuestionText)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Sname)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Cname)
        </td>

    </tr>
}

</table>

No me parecen encontrar la solución para esto, ¿tengo que volver a mi viewmodel dentro de la acción de controlador index? Cualquier ayuda es muy apreciada.

Gracias de antemano!

Saludos!

  • Parece db.Pregunta devuelve NKI3.Modelos.Pregunta en lugar de la ViewModel se muestran arriba.
InformationsquelleAutor Obsivus | 2012-02-22

3 Comentarios

  1. 7

    Véase la nota más abajo
    Serviría para volver Enumerable?

     return View(Q.AsEnumerable()); 

    EDIT: Sí, sé que mi primer tiro fue malo!… no notó que su punto de vista quiere un

    @model IEnumerable<NKI3.ViewModels.IndexCreateViewModel>

    Estoy de acuerdo con los demás acerca de la conversión a la devolución del valor de la coincidencia de tipo…
    o ajustar la espera tipo en la opinión de…
    tal vez usted puede tomar ventaja de la asignación de framworks como automapper (http://automapper.org/) para ayudarle a resolver para la asignación de código entre los objetos del dominio y viewmodels.

    de ti – No hay necesidad de más abajo en la votación…

    • He probado y tengo este error: El modelo de elemento pasado en el diccionario es de tipo ‘System.De datos.Objetos.ObjectQuery1[NKI3.Models.Question]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable1[NKI3.ViewModels.IndexCreateViewModel]’.
    • Tuve que recurrir a la cartografía, pero yo No uso automapper ahora funciona a la perfección
    • Se me olvidó @model IEnumerable<... en la parte superior de la vista y tiene un error similar, y tuvo que volver a revisar lo que me había perdido. Buen post chicos.
  2. 0

    Sí – la acción debe devolver un modelo del mismo tipo declarado en la primera línea de su archivo de vista.

    Cambiar la primera línea en la vista de archivo:

    @model IndexCreateViewModel

    y cambiar su código de acción (Index()) a un código que va a devolver un objeto de tipo IndexCreateViewModel.

    • Voy a probar esto después de mi almuerzo y que se informe de cómo ha ido 🙂
    • No funciona, error: no Se puede utilizar una instrucción foreach para las variables de tipo NKI3.ViewModels.IndexCreateViewModel porque NKI3.ViewModels.IndexCreateViewModel no contienen un público definición de GetEnumerator
    • Usted debe cambiar IndexCreateViewModel a ser un IEnumerable de alguna que otra cosa (por ejemplo, crear una nueva clase denominada Question que será un elemento en la interfaz IEnumerable)
  3. 0

    El tipo devuelto por

    db.Question.Include(a => a.SubjectType).Include(a => a.CoreValue);

    parece ser IQueryable<NKI3.Models.Question>

    Usted necesita para convertir esa estructura (su modelo de datos) a un IEnumerable<IndexCreateViewModel>

    Si no existe ya un ayudante en su aplicación a transformar entre ellos, entonces usted tendrá que escribir una.

    IList<IndexCreateViewModel> viewmodel = new List<IndexCreateViewModel>();
    
    foreach(NKI3.Models.Question item in Q)
    {
       IndexCreateViewModel viewItem = new IndexCreateViewModel();
       //I don't know the properties of Question.
       viewItem.QuestionText = item.????;
       viewItem.CName = item.???;
       viewItem.SName =-item.???;
       viewModel.Add(viewItem);
    }
    return View(viewModel);
    • El problema es que la Pregunta de la entidad sólo tiene QID y QuestionText. Así ViewItem.Cname = item.Cname puedo trabajar. CoreValue y SubjectType entitys han Cname y Sname valores.
    • Creo que es necesario dar un paso atrás y ver cómo su modelo de datos se refiere a su modelo de vista.

Dejar respuesta

Please enter your comment!
Please enter your name here