[解決済み] 辞書に渡されたモデル項目は、型が ... だが、この辞書は型のモデル項目を必要とする。
質問
この質問とコミュニティ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
を部分ビューに追加します。 また、もし
MyBar
は
null
(初期化されていない) 場合は、デフォルトで
Foo
がパーシャルに渡されますが、その場合、そのパーシャルに必要なのは
@Html.Partial("_Bar", new Bar())
レイアウトでモデルを宣言する
レイアウトファイルがモデル宣言を含む場合、そのレイアウトを使用する全てのビューは、同じモデル、またはそのモデルから派生したモデルを宣言しなければなりません。
もし、Layoutの中に別のモデルのhtmlを含めたい場合は、Layoutの中で
@Html.Action(...)
を呼び出して
[ChildActionOnly]
メソッドはそのモデルを初期化し、そのための部分ビューを返します。
関連
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み] [Solved] 不正な文字列値: '\xEFxBFxBD' for column
-
[解決済み】Swashbuckle/Swagger + ASP.Net Core: "Failed to load API definition" (API定義の読み込みに失敗しました
-
[解決済み】ファイルへの読み書きの際に共有違反のIOExceptionが発生する C#
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み】WebResource.axdとは何ですか?
-
[解決済み】NULLモデルを持つrenderpartialは、間違った型を渡される
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Solved] 1つ以上のエンティティで検証に失敗しました。詳細は'EntityValidationErrors'プロパティを参照してください [重複]。
-
[解決済み】スクリプトクラスが見つからないので、スクリプトコンポーネントを追加できない?
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み] [Solved] アセンブリ System.Web.Extensions dll はどこにありますか?
-
[解決済み】Visual studio 2019がデバッグ時にフリーズする件
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み] 関数を終了するには?
-
[解決済み】WebResource.axdとは何ですか?