ASP.NET MVC ビューにクラスインスタンスを渡す際のエラー(InvalidOperationException)
2つのモデルを結合したモデルを表示しようとしたところ、こんなエラーが出ました。
-—––エラーここから––––
‘/’ アプリケーションでサーバー エラーが発生しました。
ディクショナリに型 ‘System.Collections.Generic.List`1[WordLearner.Models.WordDetail]’ のモデル項目が渡されましたが、このディクショナリには型 ‘WordLearner.Models.WordDetail’ のモデル項目が必要です。
説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。
例外の詳細: System.InvalidOperationException: ディクショナリに型 ‘System.Collections.Generic.List`1[WordLearner.Models.WordDetail]’ のモデル項目が渡されましたが、このディクショナリには型 ‘WordLearner.Models.WordDetail’ のモデル項目が必要です。
-—––エラーここまで––––
調べてみると同じエラーで困っている人がいました。
Unable to cast object of type ‘System.Data.Entity.Infrastructure.DbQuery`1[]’ using linq lambda expression
http://stackoverflow.com/a/22918838
そして回答も掲載されていました。今回検索結果のオブジェクトをビューに返すところを、クエリの状態でビューに渡しているのが原因でした💨
変数 query に FirstOrDefault() メソッドでオブジェクトを取得することで解決しました。
public ActionResult Test(int? id){ if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } Word word = db.Word.Find(id); if (word == null) { return HttpNotFound(); }
int _id = id.Value; var meaning = db.Meanings; var query = from x in db.Word join y in meaning on x.ID equals y.WordID where x.ID.Equals(_id) select new WordDetail { ID = x.ID, Spelling = x.Spelling, Meaning = y.Meaning };
return View("Details", query.FirstOrDefault());}
💬 コメント