Pregunta

Fondo

Recibo el siguiente error al intentar representar una vista parcial en ASP.NET MVC.Soy nuevo en ASP.NET MVC y estoy seguro de que el error es fácil de resolver y simplemente se debe a mi falta de comprensión total.

Pregunta (para los que no quieren leerlo todo):

Que esta causando este error ?

Detalles de excepción: System.InvalidOperationException:El elemento modelo que se pasa al diccionario es de tipo 'MyApp.Models.ClassroomFormViewModel'Pero este diccionario requiere un elemento modelo de tipo 'System.Collections.Generic.IEnumerable1[MyApp.Models.ClassroomFormViewModel]'`.


entidades

Tengo dos entidades con una relación padre/hijo.

Classroom                   StickyNote 
------------                -----------
Id          1 -----         Id
Name               \        Name
(...)               \       Content
                     ---- * ClassroomID

Modelo

En el Model El contenido de StickyNote se guarda en una tabla diferente y se accede a él (usando Linq-to-SQL a través del siguiente método:

public IQueryable<StickyNote> GetStickyNotesByClassroom(Classroom classroom)
{
     return from stickynote in db.StickyNotes
            where stickynote.ClassroomID == classroom.ID
            select stickynote;
}

Error

He creado una vista parcial para mostrar StickyNote contenido ya que "pertenece" al aula en la que se encuentra.El problema con el que me encuentro es que no puedo mostrarlo y recibo el siguiente error:

El elemento modelo que se pasa al diccionario es de tipo: 'MyApp.Models.ClassroomFormViewModel'Pero este diccionario requiere un elemento modelo de tipo 'System.Collections.Generic.IEnumerable1[MyApp.Models.ClassroomFormViewModel]'`.Descripción:Se produjo una excepción no controlada durante la ejecución de la solicitud web actual.Revise el rastro de la pila para obtener más información sobre el error y dónde se originó en el código.

Detalles de excepción: System.InvalidOperationException:El elemento modelo que se pasa al diccionario es de tipo 'MyApp.Models.ClassroomFormViewModel'Pero este diccionario requiere un elemento modelo de tipo 'System.Collections.Generic.IEnumerable1[MyApp.Models.ClassroomFormViewModel]'`.

Vista parcial

Aquí está el código de vista parcial:

<%@ Control Language="C#" Inherits="
System.Web.Mvc.ViewUserControl<IEnumerable<MyApp.Models.ClassroomFormViewModel>>" %>

    <table background="../../images/corkboard.jpg">

    <% foreach (var items in Model) { %>

        <tr>
        <% foreach (var item in items.StickyNotes) { %>
            <td><div class="sticky_note_container">

<!-- actually use a post it note here on the page -->
<div class="sticky_note">
<div class="sticky_note_content">
<!-- content of sticky note here -->
<% Html.ActionLink(item.Name, "ShowStickyNoteContent"); %>
<!-- end of content of sticky note -->
</div>
</div>
<div class="sticky_note_footer">&nbsp;</div>
<br clear="all" />
</div>
         </td>
      <% } %>
     </tr>
   <% } %>
</table>

Vista principal

Y el código de la otra Vista que lo llama:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits=
"System.Web.Mvc.ViewPage<MyApp.Models.ClassroomFormViewModel>" %>
{...}
  <% 
     Html.RenderPartial("StickyNotes", Model);
  %>
¿Fue útil?

Solución

Está pasando en una sola instancia de su ClassroomFormViewModel en la vista y está esperando un una colección decir IEnumerable<ClassroomFormViewModel>.

Cambiar su declaración en su PartialView a

Inherits="
System.Web.Mvc.ViewUserControl<MyApp.Models.ClassroomFormViewModel>"

o

Lo que realmente quiere (después de mirar realmente su código) es un IEnumerable<ClassroomFormViewModel>

por lo que su modelo en su página de llamada tiene que ser de IEnumerable<ClassroomFormViewModel>

En esencia que está tratando de hacer esto

public void Render(ClassroomFormViewModel model)
{
    RenderPartial(model) //Cannot cast single instance into an IEnumerable
}
public string RenderPartial(IEnumerable<ClassroomFormViewModel> model)
{
    //Do something
}

Otros consejos

Su parcial debe comenzar

<%@ Control Language="C#" Inherits="
System.Web.Mvc.ViewUserControl<MyApp.Models.ClassroomFormViewModel>" >

Creo que se desea mostrar un aula en la que la página. Si desea mostrar más, entonces no utilizar una lista de ViewModels. Utilice uno modelo de vista que tiene una lista de aulas

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top