Работа с частичными представлениями в ASP.NET MVC - PullRequest
10 голосов
/ 09 июля 2009

Фон

При попытке отрисовки частичного представления в 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 Содержимое StickyNote хранится в другой таблице и доступно (используя Linq-to-SQL следующим способом:

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

Error

Я создал частичное представление для отображения 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">&nbsp;</div>
<br clear="all" />
</div>
         </td>
      <% } %>
     </tr>
   <% } %>
</table>

Родительский вид

И код из другого View, который его вызывает:

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

Ответы [ 2 ]

8 голосов
/ 09 июля 2009

Вы передаете один экземпляр вашей ClassroomFormViewModel в, а представление ожидает коллекцию, т.е. IEnumerable<ClassroomFormViewModel>.

Измените ваше объявление в PartialView на

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

OR

То, что вы действительно хотите (после того, как действительно посмотрите на ваш код), это 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 голосов
/ 09 июля 2009

Ваше частичное должно начинаться

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

Полагаю, вы хотите отобразить одну классную комнату на своей странице. Если вы хотите отобразить больше, не используйте список моделей просмотра. Используйте одну viewmodel, которая имеет список классов

...