10

バックグラウンド

ASP.NET MVCで部分ビューをレンダリングしようとすると、次のエラーが発生します。私はASP.NETMVCを初めて使用しますが、エラーは簡単に解決でき、完全に理解していないことが原因であると確信しています。

質問すべてを読みたくない人のために):

このエラーの原因は何ですか?

例外 System.InvalidOperationExceptionの詳細::ディクショナリに渡されるモデルアイテムはタイプです 'MyApp.Models.ClassroomFormViewModel' が、このディクショナリにはタイプ 'System.Collections.Generic.IEnumerable1[MyApp.Models.ClassroomFormViewModel]'`のモデルアイテムが必要です。


エンティティ

親子関係を持つ2つのエンティティがあります。

教室StickyNote
------------ -----------
Id 1 -----Id
名前\名前
(...) \ コンテンツ
                     ---- * ClassroomID

モデル

ModelStickyNoteでは、コンテンツは別のテーブルに保持され、アクセスされます(次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.IEnumerable1[MyApp.Models.ClassroomFormViewModel]'`のモデルアイテムが必要です。説明:現在のWebリクエストの実行中に未処理の例外が発生しました。エラーとそれがコードのどこで発生したかについての詳細は、スタックトレースを確認してください。

例外 System.InvalidOperationExceptionの詳細::ディクショナリに渡されるモデルアイテムはタイプです 'MyApp.Models.ClassroomFormViewModel' が、このディクショナリにはタイプ 'System.Collections.Generic.IEnumerable1[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);
  %>
4

2 に答える 2

8

ClassroomFormViewModel の単一のインスタンスを渡しており、View はコレクションを期待しています。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
}
于 2009-07-09T14:19:32.327 に答える
2

あなたのパーシャルが始まるはずです

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

ページに 1 つの教室を表示したいと思います。もっと表示したい場合は、ビューモデルのリストを使用しないでください。教室のリストを持つ 1 つのビューモデルを使用する

于 2009-07-09T14:16:09.367 に答える