Работа с частичными представлениями в ASP.NET MVC
Фон
Я получаю следующую ошибку при попытке визуализации частичного представления в ASP.NET MVC. Я новичок в ASP.NET MVC и уверен, что ошибка проста в разрешении и просто проистекает из моего отсутствия полного понимания.
Вопрос (для тех, кто не хочет читать все):
Что вызывает эту ошибку?
Сведения об исключении: System.InvalidOperationException
: Элемент модели, переданный в словарь имеет тип 'MyApp.Models.ClassroomFormViewModel'
но для этого словаря требуется модель элемент типа 'System.Collections.Generic.IEnumerable
1 [MyApp.Models.ClassroomFormViewModel] ''.
Entites
У меня есть два объекта с родительским/дочерним отношением.
Classroom StickyNote
------------ -----------
Id 1 ----- Id
Name \ Name
(...) \ Content
---- * ClassroomID
Model
В Model
содержимое StickyNote хранится в другой таблице и доступно (с помощью Linq-to-SQL
с помощью следующего метода:
public IQueryable<StickyNote> GetStickyNotesByClassroom(Classroom classroom)
{
return from stickynote in db.StickyNotes
where stickynote.ClassroomID == classroom.ID
select stickynote;
}
Ошибка
Я создал частичный вид для отображения содержимого StickyNote
, так как он "принадлежит" его классу. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу ее отобразить и получить следующую ошибку:
Элемент модели, переданный в словарь имеет тип: 'MyApp.Models.ClassroomFormViewModel'
но для этого словаря требуется модель элемент типа 'System.Collections.Generic.IEnumerable
1 [MyApp.Models.ClassroomFormViewModel] ''. Описание: Необработанное исключение произошли во время выполнения текущий веб-запрос. Пожалуйста, просмотрите трассировки стека для получения дополнительной информации о ошибка и где она возникла в код.
Сведения об исключении: System.InvalidOperationException
: Элемент модели, переданный в словарь имеет тип 'MyApp.Models.ClassroomFormViewModel'
но для этого словаря требуется модель элемент типа 'System.Collections.Generic.IEnumerable
1 [MyApp.Models.ClassroomFormViewModel] ''.
Частичный вид
Вот код частичного просмотра:
<%@ 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>
Родительский просмотр
И код другого вида, который вызывает его:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits=
"System.Web.Mvc.ViewPage<MyApp.Models.ClassroomFormViewModel>" %>
{...}
<%
Html.RenderPartial("StickyNotes", Model);
%>
Ответы
Ответ 1
Вы передаете один экземпляр своего класса ClassroomFormViewModel, и View ожидает коллекцию, т.е. IEnumerable<ClassroomFormViewModel>.
Измените свою декларацию в своем PartialView на
Inherits="
System.Web.Mvc.ViewUserControl<MyApp.Models.ClassroomFormViewModel>"
ИЛИ
Что вы действительно хотите (после действительно просмотра вашего кода) IS IEnumerable<ClassroomFormViewModel>
поэтому ваша Модель на вашей вызывающей странице должна быть IEnumerable<ClassroomFormViewModel>
По существу вы пытаетесь это сделать
public void Render(ClassroomFormViewModel model)
{
RenderPartial(model) //Cannot cast single instance into an IEnumerable
}
public string RenderPartial(IEnumerable<ClassroomFormViewModel> model)
{
//Do something
}
Ответ 2
Ваше частичное начало должно начинаться
<%@ Control Language="C#" Inherits="
System.Web.Mvc.ViewUserControl<MyApp.Models.ClassroomFormViewModel>" >
Я думаю, вы хотите отобразить один класс на своей странице.
Если вы хотите отобразить больше, не используйте список viewmodels.
Используйте одну модель, содержащую список классов.