如何从多对多关系中获取数据? (剃刀)

时间:2012-04-11 22:19:57

标签: c# asp.net asp.net-mvc-3 razor

我刚刚成功地在BlogPosts和实体框架代码中的主题之间建立了多对多关系。所以有一个主题列表(“CSS”,“HTML”,“ASP.NET”),BlogPost可以有很多,反之亦然。所以目前我有EF创建3个表,中间表是BlogPost和Topic本身的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>
}

以上所有工作都很好,但我想将 * 替换为与此特定帖子相关的主题。我似乎无法弄清楚这一点。我是否必须以与控制器不同的方式传递模型?目前我将整个数据库传递给此页面,因为它将使用来自不同表的各种信息。我只是迷失在这一个。任何帮助将非常感激! (显然我想用评论做类似的事情)

谢谢!

3 个答案:

答案 0 :(得分:2)

不,不,不,不要将整个数据库传递给视图。您需要从数据库中抽象出您的视图数据。以最适合视图使用它的格式创建仅包含此视图所需数据的视图模型。根据您是否相信胖控制器或精简控制器,使用控制器或型号代码将数据从数据库转换为视图模型。 MVC的重点是关注点的分离,如果你让你的数据模型泄漏到视图代码中,你将失去这个基本思想,并失去各层之间松散耦合的好处。

答案 1 :(得分: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)
    {

    }
}

答案 2 :(得分:0)

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

是。根据视图需求制作模型(视图模型)。在那里填写正确的对象图(哪个博客转到哪个主题)。然后将该实例化对象传递到视图中,并在视图中引用这些对象。