Работа с частичными представлениями в ASP.NET MVC
-
12-09-2019 - |
Вопрос
Фон
Я получаю следующую ошибку при попытке отобразить частичное представление в ASP.NET MVC.Я новичок в ASP.NET MVC и уверен, что ошибку легко устранить, и она связана с моим отсутствием полного понимания.
Вопрос (для тех, кто не хочет читать все):
Что вызывает эту ошибку?
Подробности исключения:
System.InvalidOperationException
:Элемент модели, переданный в словарь, имеет тип'MyApp.Models.ClassroomFormViewModel'
Но этот словарь требует модельного элемента типа'System.Collections.Generic.IEnumerable
1[MyApp.Models.ClassroomFormViewModel]'`.
Сущности
У меня есть два объекта с отношениями родитель/потомок.
Classroom StickyNote ------------ ----------- Id 1 ----- Id Name \ Name (...) \ Content ---- * ClassroomID
Модель
в 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);
%>
Решение
Вы передаете один экземпляр вашей ClassroomFormViewModel, и представление ожидает коллекцию, т.е. IEnumerable<ClassroomFormViewModel>.
Измените свое объявление в PartialView на
Inherits="
System.Web.Mvc.ViewUserControl<MyApp.Models.ClassroomFormViewModel>"
ИЛИ
То, что вы действительно хотите (после внимательного изучения вашего кода), — это 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
}
Другие советы
Ваш частичный должен начаться
<%@ Control Language="C#" Inherits="
System.Web.Mvc.ViewUserControl<MyApp.Models.ClassroomFormViewModel>" >
Я думаю, вы хотите отобразить на своей странице один класс.Если вы хотите отобразить больше, не используйте список моделей просмотра.Используйте одну модель представления со списком классов.