4

MVC を (初めて) エンティティ フレームワーク、データベースを最初に使用しています。

私がやりたいことは、データベースからのデータを単一のビューに表示することです。最初にデータベースを作成し、次にすべてのテーブルを含むデータベースに基づいて ADO.NET Entity Data Model を作成しました。次に、Entity Data Model をモデルとして厳密に型指定された Index ビューを作成しました。

私のインデックスでは、一番上にあります

@model IEnumerable<Forum6.Models.Forum>

これにより、データベースからテーブル「フォーラム」から行を取得できます。追加のモデルを追加しようとすると、実行時に次のエラー メッセージが表示されます。

Line 1: @model IEnumerable<Forum6.Models.Forum>
Line 2: @model2 IEnumerable<Forum6.Models.Post>  

パーサー エラー メッセージ: 1 つのファイルで使用できる 'model' ステートメントは 1 つだけです。

答えを探した後、私はこれを見つけました: ASP MVC 3 の 1 つのビューにある 2 つのモデル 答えは、すべてのモデル (テーブル) を含む ViewModel (ParentModel) を作成することでした。これは私が作成した ViewModel です。

public class ViewModel
{
    public IEnumerable<Forum6.Models.Forum>         Forum       { get; set; }
    public IEnumerable<Forum6.Models.Post>          Post        { get; set; }
    public IEnumerable<Forum6.Models.Topics>        Topics      { get; set; }
    public IEnumerable<Forum6.Models.Users>         Users       { get; set; }
    public IEnumerable<Forum6.Models.PrivMsg>       PrivMsg     { get; set; }
    public IEnumerable<Forum6.Models.Permission>    Permission  { get; set; }
}

コントローラーを次のように編集しました。

   public class HomeController : Controller
{
    // ForumDBEntities old_db = new ForumDBEntities();

    ViewModel db = new ViewModel();

    public ActionResult Index()
    {
        return View(db);
    }
}

次に、古い Index ビューを、ViewModel をモデルとして使用する厳密に型指定された新しいビューに置き換えました。を含む:

@model IEnumerable<Forum6.Models.ViewModel>

これを実行しようとすると、次のエラーが表示されます。

ディクショナリに渡されたモデル アイテムのタイプは 'Forum6.Models.ViewModel' ですが、このディクショナリにはタイプ 'System.Collections.Generic.IEnumerable`1[Forum6.Models.ViewModel] のモデル アイテムが必要です。

「ViewModel」を列挙可能にするにはどうすればよいですか? または、私のエラーは別の場所にありますか?

4

2 に答える 2

10

単一の ViewModel 内に IEnumerables をラップしているため、変更@model IEnumerable<Forum6.Models.ViewModel>する必要があります。@model Forum6.Models.ViewModel

経験則として、ViewModel と View の間に 1 対 1 の関係を持たせることをお勧めします。 ここに画像の説明を入力

これはあなたにとって良い読み物かもしれません:http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/(したくない場合は、オートマッパーの部分を無視してくださいその道を行く)

また、ViewModel に実際のデータを入れる必要があります。

ViewModel db = new ViewModel();

public ActionResult Index()
{
    return View(db);
}

ビューに空のViewModelを与えるだけです。それを行う1つの方法はそうです。

public ActionResult Index()
{
    var model = new ViewModel
                    {
                        Forum = db.GetForum(),
                        Post = db.GetPost(),
                        Topic = you get the idea
                    };

    return View(model);
}

最後に、一般的にプロパティや変数に名前を付けるときは、リストが含まれる場合は動詞の複数形を使用する必要があります。したがって、ViewModel は次のようになります。

public class ViewModel
{
    public IEnumerable<Forum6.Models.Forum>         Forums      { get; set; }
    public IEnumerable<Forum6.Models.Post>          Posts       { get; set; }
    public IEnumerable<Forum6.Models.Topics>        Topics      { get; set; }
    public IEnumerable<Forum6.Models.Users>         Users       { get; set; }
    public IEnumerable<Forum6.Models.PrivMsg>       PrivMsgs    { get; set; }
    public IEnumerable<Forum6.Models.Permission>    Permissions { get; set; }
}
于 2013-03-12T13:44:32.740 に答える
1

クラスのコレクションではなく、クラスの単一のインスタンスを渡すように変更@model IEnumerable<Forum6.Models.ViewModel>します。@model Forum6.Models.ViewModelViewModel

すべてのコレクションは、ビュー モデルの単一のインスタンスに渡されます。

于 2013-03-12T12:07:25.943 に答える