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());
}

コメント

このブログの人気の投稿

PHP クリックされたボタンに応じて処理を実行する

JavaScript Date(日付) データを yyyy/MM/dd 形式にフォーマットする

jQuery ページ初期表示時に処理を実行