在ASP.NET MVC中使用部分视图

时间:2009-07-09 13:43:25

标签: c# .net asp.net-mvc view partial-views

背景

尝试在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;
}

错误

我创建了一个显示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 个答案:

答案 0 :(得分:8)

您正在将ClassroomFormViewModel的单个实例传入,并且View期待一个集合,即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
}

答案 1 :(得分:2)

你的部分应该开始

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

我想你想在你的页面上显示一个教室。 如果要显示更多,请不要使用视图模型列表。 使用一个包含教室列表的视图模型