2009-07-09 9 views
10

ContexteUtilisation des vues partielles dans ASP.NET MVC

Je reçois l'erreur suivante en essayant de rendre une vue partielle dans ASP.NET MVC. Je suis nouveau à ASP.NET MVC et je suis sûr que l'erreur est simple à résoudre et vient juste de mon manque de compréhension complète.

Question (pour ceux qui ne veulent lire tout):

Quelle est la cause de cette erreur?

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]'`.


Entités mises

J'ai deux entités ayant une relation parent/enfant.

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

Modèle

Dans le Model le contenu StickyNote est conservé dans une autre table, et accessible (en utilisant Linq-to-SQL par la méthode suivante:

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

Erreur

J'ai créé une vue partielle f ou afficher StickyNote contenu car il appartient à la salle de classe, il est sur. Le problème que je suis en cours d'exécution en est que je ne suis pas en mesure d'obtenir à afficher, et l'erreur suivante:

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]'`.

Vue partielle

Voici le code de la vue partielle:

<%@ 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> 

Parent Voir

Et le code de l'autre point de vue qui appelle il:

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

Répondre

8

Vous passez une instance de votre ClassroomFormViewModel dans et la vue attend une collection, c'est-à-dire.IEnumerable<ClassroomFormViewModel>.

Changer votre déclaration dans votre PartialView à

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

OU

Qu'est-ce que vous voulez vraiment (après avoir regardé vraiment votre code) est un IEnumerable<ClassroomFormViewModel>

si votre modèle dans votre page d'appel doit être de IEnumerable<ClassroomFormViewModel>

Essentiellement, vous essayez de le faire

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

Votre partielle devrait commencer

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

Je suppose que vous voulez afficher une salle de classe sur vous page. Si vous souhaitez afficher plus alors n'utilisez pas une liste de viewmodels. Utilisez un modèle de vue qui a une liste de salles de classe

Questions connexes