1

我刚刚在实体框架代码优先方法中成功地在 BlogPosts 和主题之间建立了多对多关系。因此,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>
}

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

谢谢!

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 回答