2009-07-09 27 views
10

AntecedentesTrabajar con vistas parciales en ASP.NET MVC

que estoy recibiendo el siguiente error al intentar hacer una vista parcial en ASP.NET MVC. Soy nuevo en ASP.NET MVC y estoy seguro de que el error es simple de resolver y solo se debe a mi falta de comprensión.

Pregunta (para los que no quieren leer todo lo):

lo que está causando este error?

Exception Details: System.InvalidOperationException : The model item passed into the dictionary is of type 'MyApp.Models.ClassroomFormViewModel' but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable 1[MyApp.Models.ClassroomFormViewModel]'`.


ENTIDADES

que tienen dos entidades con una relación padre/hijo.

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

Modelo

En el Model el contenido StickyNote se mantiene en una tabla diferente, y se accede (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 f o mostrando StickyNote contenido ya que 'pertenece' al aula en la que se encuentra. El problema que estoy corriendo en es que no soy capaz de conseguir que se muestre, y recibir el siguiente error:

The model item passed into the dictionary is of type: 'MyApp.Models.ClassroomFormViewModel' but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable 1[MyApp.Models.ClassroomFormViewModel]'`. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.InvalidOperationException : The model item passed into the dictionary is of type 'MyApp.Models.ClassroomFormViewModel' but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable 1[MyApp.Models.ClassroomFormViewModel]'`.

Vista parcial

Aquí es el código de la 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> 

Padres Ver

Y el código de la otra vista que llama que:

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

Respuesta

8

Está transfiriendo en una sola instancia de ClassroomFormViewModel a y la Vista espera una colección, es decir.IEnumerable<ClassroomFormViewModel>.

Cambiar la 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 necesita ser de IEnumerable<ClassroomFormViewModel>

Básicamente, estás 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 
} 
2

Su parcial debe comenzar

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

supongo que desea mostrar un aula en la que la página. Si quiere mostrar más, entonces no use una lista de modelos de vista. Utilice un modelo de vista que tenga una lista de aulas

Cuestiones relacionadas