Lavorare con vista parziale in ASP.NET MVC
-
12-09-2019 - |
Domanda
Sfondo
Ricevo il seguente errore quando si cerca di rendere una vista parziale in ASP.NET MVC. Sono nuovo di ASP.NET MVC e sono sicuro che l'errore è semplice da risolvere e solo deriva dalla mia mancanza di comprensione completa.
Domanda ( per chi non vuole leggere tutto ):
Qual è la causa di questo errore?
Dettagli eccezione:
System.InvalidOperationException
: L'articolo modello di passato nel dizionario è di tipo'MyApp.Models.ClassroomFormViewModel'
ma questo dizionario richiede un modello articolo dello stesso tipo'System.Collections.Generic.IEnumerable
1 [MyApp.Models.ClassroomFormViewModel] ' `.
entités
Ho due entità con una relazione padre / figlio.
Classroom StickyNote ------------ ----------- Id 1 ----- Id Name \ Name (...) \ Content ---- * ClassroomID
Modello
Nel Model
il contenuto StickyNote è conservata in una tabella diversa, e accessibili (utilizzando Linq-to-SQL
tramite il seguente metodo:
public IQueryable<StickyNote> GetStickyNotesByClassroom(Classroom classroom)
{
return from stickynote in db.StickyNotes
where stickynote.ClassroomID == classroom.ID
select stickynote;
}
Errore
Ho creato una vista parziale per visualizzare il contenuto StickyNote
dal momento che 'appartiene' in classe è su. Il problema che sto funzionando in è che io non sono in grado di farlo per visualizzare, e visualizzato il seguente errore:
La voce del modello passato nel dizionario è di tipo:
'MyApp.Models.ClassroomFormViewModel'
ma questo dizionario richiede un modello articolo dello stesso tipo'System.Collections.Generic.IEnumerable
1 [MyApp.Models.ClassroomFormViewModel] ' `. Descrizione: un'eccezione non gestita durante l'esecuzione del richiesta Web corrente. Si prega di rivedere la Analisi dello stack per ulteriori informazioni su l'errore e dove ha avuto origine in il codice.Dettagli eccezione:
System.InvalidOperationException
: L'articolo modello di passato nel dizionario è di tipo'MyApp.Models.ClassroomFormViewModel'
ma questo dizionario richiede un modello articolo dello stesso tipo'System.Collections.Generic.IEnumerable
1 [MyApp.Models.ClassroomFormViewModel] ' `.
Vista parziale
Ecco il codice vista parziale:
<%@ 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"> </div>
<br clear="all" />
</div>
</td>
<% } %>
</tr>
<% } %>
</table>
Parent Visualizza
E il codice dall'altro View che lo chiama:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits=
"System.Web.Mvc.ViewPage<MyApp.Models.ClassroomFormViewModel>" %>
{...}
<%
Html.RenderPartial("StickyNotes", Model);
%>
Soluzione
Si passa a una singola istanza del vostro ClassroomFormViewModel in e la vista è aspettate un una collezione vale a dire IEnumerable<ClassroomFormViewModel>.
Cambia la tua dichiarazione nella vostra PartialView a
Inherits="
System.Web.Mvc.ViewUserControl<MyApp.Models.ClassroomFormViewModel>"
o
Che cosa si vuole veramente (dopo molto guardando il codice) è un IEnumerable<ClassroomFormViewModel>
in modo che il modello in vostro pagina chiamante deve essere di IEnumerable<ClassroomFormViewModel>
In sostanza si sta cercando di fare questo
public void Render(ClassroomFormViewModel model)
{
RenderPartial(model) //Cannot cast single instance into an IEnumerable
}
public string RenderPartial(IEnumerable<ClassroomFormViewModel> model)
{
//Do something
}
Altri suggerimenti
Il parziale dovrebbe iniziare
<%@ Control Language="C#" Inherits="
System.Web.Mvc.ViewUserControl<MyApp.Models.ClassroomFormViewModel>" >
Credo che si desidera visualizzare una classe su di voi pagina. Se si desidera visualizzare più allora non usare un elenco di ViewModel. Utilizzare uno ViewModel che ha una lista di aule