我刚刚成功地在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>
}
以上所有工作都很好,但我想将 * 替换为与此特定帖子相关的主题。我似乎无法弄清楚这一点。我是否必须以与控制器不同的方式传递模型?目前我将整个数据库传递给此页面,因为它将使用来自不同表的各种信息。我只是迷失在这一个。任何帮助将非常感激! (显然我想用评论做类似的事情)
谢谢!
答案 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?
是。根据视图需求制作模型(视图模型)。在那里填写正确的对象图(哪个博客转到哪个主题)。然后将该实例化对象传递到视图中,并在视图中引用这些对象。