1

EntityFrameworkのコードファーストアプローチでBlogPostsとTopicsの間に多対多の関係を設定することに成功しました。したがって、BlogPostが多く持つことができるトピック(「CSS」、「HTML」、「ASP.NET」)のリストがあり、その逆もあります。そのため、現在EFに3つのテーブルを作成させました。中央のテーブルは、BlogPostとトピック自体の両方のIDです。

今、私は自分のホームページのRazorビューにいます。

@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全体をこのページに渡しています。これは、さまざまなテーブルのさまざまな情報を使用するためです。私はこれで迷子になっています。どんな助けでも本当にありがたいです!(もちろん、コメントで似たようなことをしたいです)

ありがとう!

4

3 に答える 3

2

いいえ、いいえ、いいえ、データベース全体をビューに渡さないでください。データベースからビューデータを抽象化する必要があります。このビューに必要なデータのみを含むビューモデルを、ビューが使用するのに最適な形式で作成します。ファットコントローラーとシンコントローラーのどちらを信じているかに応じて、コントローラーまたはモデルコードを使用して、データベースからのデータをビューモデルに変換します。MVCの要点は関心の分離であり、データモデルをビューコードにリークさせると、この基本的な考え方が失われ、さまざまなレイヤー間の緩い結合の利点が失われます。

于 2012-04-11T22:26:24.463 に答える
1

推奨される行動方針を開始するため。ビューモデルは通常のクラスになります。

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

コントローラでは、ビューに必要なものを入力します

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)
    {

    }
}
于 2012-04-12T01:21:30.010 に答える
0

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

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

于 2012-04-11T22:26:04.877 に答える