2012-04-11 13 views
1

私は、BlogPostsとトピックをEntity Frameworkコードの最初のアプローチで多対多の関係に設定しました。そのため、BlogPostに多数のことができるトピック(「CSS」、「HTML」、「ASP.NET」)のリストがあり、その逆もあります。だから私はEFに3つのテーブルを作成させました。中間のテーブルはBlogPostとトピック自体のIDです。多対多の関係からデータを取得するにはどうすればよいですか? (剃刀)

私は私のホームページの剃刀の眺めに入っています。

@model MvcBlog.Models.MyModel 

@foreach (var post in Model.Posts) 
{ 
    <div class="blogpost"> 
     <h2>@Html.DisplayFor(modelItem => post.Title)</h2> 
     <div class="post_info">@Html.DisplayFor(modelItem => post.DateCreated)<span class="right">Blog</span></div> 
     <p>@Html.Raw(post.Content)</p> 
     <div class="post_close"> 
      <span class="left"> 
       *********************** 
      </span> 
      <span class="right"><img src="Content/images/comment.jpg" alt="" /> 0 comments</span> 
     </div> 
    </div> 
} 

だけで罰金以上の作品のすべてが、私は、この特定の記事に関連したトピックについて*を交換したいです。私はこれを理解できないようです。コントローラとモデルを別々に渡す必要がありますか?現在、私は異なるテーブルのさまざまな情報を使用するので、このページにDB全体を渡しています。私はちょうどこの1つに失われています。どんな助けでも本当にありがとう! (明らかにコメントと似たようなことをしたい)

ありがとう!

答えて

1

おすすめのアクションコースを開始するにはあなたは私の避難所を「推測ビュー

public ActionResult Index() 
{ 
    // assuming entity framework 
    List<PostViewModel> posts = (from p in context.Set<Post>() 
           select new PostViewModel { 
            Title = p.Title, 
            DateCreated = p.DateCreated, 
            Topics = p.Topics 
           }).ToList(); 
    return View(posts); 
} 

そして、あなたのビューで

@model List<PostViewModel> 

@foreach(Post post in Model) 
{ 
    @Html.DisplayFor(m=>m.Title) 

    @foreach(Topic topic in post.Topics) 
    { 

    } 
} 
+0

ああ私は理解し始めています。 context.Set ()の「コンテキスト」とは何ですか?文脈は私のために存在しません、私はただの何かを無視していますか?お返事をありがとうございます。 –

+0

@ pjb5064。 「コンテキスト」は、Entity FrameworkのDBContextを参照しています。私はそれを例として挙げました。基本的に、あなたはどこかからあなたのデータを取得しなければなりません、そして、あなたが入手した場所はあなたのコントローラの中にあります。 –

+0

大丈夫...今すぐ実行しようとするたびにエラーが発生しています(ビルドに成功しました)。エンティティまたは複合型 'MvcBense.Models.BlogPost'をLINQ to Entitiesクエリで構築できません。 –

0

Do I have to pass the model differently from the controller?

はい。ビューのニーズに合わせてモデルを作成します(ビューモデル)。そこに正しいオブジェクトグラフを入力します(どのブログにどのトピックが表示されるか)。そのインスタンス化されたオブジェクトをビューに渡し、それらのオブジェクトをビューで参照します。

2

いいえ、いいえ、いいえ、データベース全体をビューに渡さないでください。データベースからビューデータを抽象化する必要があります。このビューに必要なデータのみを含むビュー・モデルを、ビューが消費するのに最適な形式で作成します。太いまたは薄いコントローラを使用するかどうかに応じて、コントローラまたはモデルコードを使用して、データをデータベースからビューモデルに変換します。 MVCの全体的なポイントは懸念の分離であり、データモデルがビューコードに漏れるようにすると、この基本的な考え方を失い、さまざまなレイヤー間の疎結合のメリットが失われます。

+0

のために必要なものを埋める、あなたのコントローラで

public class PostViewModel { public string Title { get; set; } public DateTime DateCreated { get; set; } public List<Topic> Topics { get; set; } public List<Comment> Comments { get; set; } } 

:あなたのビューモデルは、通常のクラスになります1つのコントローラで複数のモデルの例を見つけることはできません。私が見てきたことはすべて一つの基本的な機能でした。あなたは正しい方向に私をリンクできますか?ありがとうございました! –

+0

@ pjb5064 1つのビューモデルを使用しますが、そのモデルには必要なすべてのデータが含まれています。例えば、あなたのモデルは、PostViewModelのコレクション(またはページの価値を含むPageModelや、ページ数、ページ数など)になります。これらのそれぞれには、その投稿のコメントを表すCommentModelオブジェクトの集合を含む1つの投稿のデータが含まれています。要点は、これらが実際のエンティティから切り離されていることです。そうすれば、DBの変更が必ずしもビューコードに反映されるわけではありません。 – tvanfosson

+0

ありがとうございます。ご覧のとおり、私は多くのことを学ぶ必要があります。私は大学2年で、基本的なことをやっている.aspxウェブフォームで少し仕事をしていました。その仕事は最後にはうまくいかず、MVC3を学んでブログを作ってほしいと思っています。ここで学ぶべき教訓がたくさんあります... MVCのポイントを補強してくれてありがとうと思います。私はここで標準から逸脱しないようにしています。 –

関連する問題