代码之家  ›  专栏  ›  技术社区  ›  George Stocker NotMe

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

  •  10
  • George Stocker NotMe  · 技术社区  · 15 年前

    背景

    尝试在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]'`。 描述:未处理的异常 在执行期间发生 当前Web请求。请查看 有关堆栈跟踪的详细信息 错误及其来源 代码。

    异常详细信息: 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>
    

    父视图

    另一个视图中调用它的代码:

    <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits=
    "System.Web.Mvc.ViewPage<MyApp.Models.ClassroomFormViewModel>" %>
    {...}
      <% 
         Html.RenderPartial("StickyNotes", Model);
      %>
    
    2 回复  |  直到 15 年前
        1
  •  8
  •   Micah    15 年前

    您正在将ClassRoomFormViewModel的单个实例传入,而视图需要一个集合,即。 IEnumerable<ClassroomFormViewModel>.

    将您在部分视图中的声明更改为

    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
    }
    
        2
  •  2
  •   Mathias F    15 年前

    你的部分应该开始

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

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