1. ホーム
  2. c#

[解決済み] 辞書に渡されたモデル項目は、型が ... だが、この辞書は型のモデル項目を必要とする。

2022-02-08 04:38:27

質問

この質問とコミュニティWikiの回答は、次のページで説明したように、多くの未解決の質問を解決するために追加されました。 このメタポスト .


あるコードがあり、実行すると例外が発生します。

辞書に渡されたモデル項目はBar型ですが、この辞書にはFoo型のモデル項目が必要です。

これはどういうことですか、どうすれば直りますか?

解決方法は?

このエラーは、モデルがtypeofとして宣言されているビューに移動していることを意味します。 Foo (を使用することにより)。 @model Foo の型であるモデルを渡しています。 Bar (用語 辞書 が使われているのは、モデルがビューに渡される際に ViewDataDictionary ).

エラーの原因としては

コントローラメソッドからビュー(または部分ビュー)に間違ったモデルを渡すこと

よくある例としては、匿名オブジェクト(または匿名オブジェクトのコレクション)を作成するクエリを使用し、それをビューに渡すことが挙げられます。

var model = db.Foos.Select(x => new
{
    ID = x.ID,
    Name = x.Name
};
return View(model); // passes an anonymous object to a view declared with @model Foo

または、単一のオブジェクトを期待するビューに、オブジェクトのコレクションを渡します。

var model = db.Foos.Where(x => x.ID == id);
return View(model); // passes IEnumerable<Foo> to a view declared with @model Foo

このエラーは、コンパイル時に、ビューのモデルと一致するようにコントローラでモデルの型を明示的に宣言することで、簡単に特定することができます。 var .

ビューから部分ビューに間違ったモデルを渡す

次のようなモデルがあるとします。

public class Foo
{
    public Bar MyBar { get; set; }
}

で宣言されたメインビューと @model Foo で宣言された部分ビューと @model Bar とすると

Foo model = db.Foos.Where(x => x.ID == id).Include(x => x.Bar).FirstOrDefault();
return View(model);

は正しいモデルをメインビューに返します。しかし、もしビューに

@Html.Partial("_Bar") // or @{ Html.RenderPartial("_Bar"); }

デフォルトでは、パーシャルビューに渡されるモデルはメインビューで宣言されたモデルなので

@Html.Partial("_Bar", Model.MyBar) // or @{ Html.RenderPartial("_Bar", Model.MyBar); }

のインスタンスを渡すために Bar を部分ビューに追加します。 また、もし MyBarnull (初期化されていない) 場合は、デフォルトで Foo がパーシャルに渡されますが、その場合、そのパーシャルに必要なのは

@Html.Partial("_Bar", new Bar())

レイアウトでモデルを宣言する

レイアウトファイルがモデル宣言を含む場合、そのレイアウトを使用する全てのビューは、同じモデル、またはそのモデルから派生したモデルを宣言しなければなりません。

もし、Layoutの中に別のモデルのhtmlを含めたい場合は、Layoutの中で @Html.Action(...) を呼び出して [ChildActionOnly] メソッドはそのモデルを初期化し、そのための部分ビューを返します。