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

C# 如何从多对多关系中获取数据?(剃刀),c#,asp.net,asp.net-mvc-3,razor,C#,Asp.net,Asp.net Mvc 3,Razor,我刚刚在实体框架代码优先方法中成功地建立了博客帖子和主题之间的多对多关系。因此有一个主题列表(“CSS”、“HTML”、“ASP.NET”),一篇博客文章可以包含很多主题,反之亦然。所以目前我已经创建了3个表,中间的表是BlogPost和主题本身的id 现在我在我的主页的剃刀视图 @model MvcBlog.Models.MyModel @foreach (var post in Model.Posts) { <div class="blogpost">

我刚刚在实体框架代码优先方法中成功地建立了博客帖子和主题之间的多对多关系。因此有一个主题列表(“CSS”、“HTML”、“ASP.NET”),一篇博客文章可以包含很多主题,反之亦然。所以目前我已经创建了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>
}
@model MvcBlog.Models.MyModel
@foreach(Model.Posts中的var post)
{
@DisplayFor(modeleItem=>post.Title)
@DisplayFor(modelItem=>post.DateCreated)博客
@Html.Raw(post.Content)

*********************** 0评论 }
上面所有的工作都很好,但是我想用与这篇文章相关的主题来替换*。我似乎无法理解这一点。我是否必须通过与控制器不同的模型?目前,我正在将整个数据库传递到此页面,因为它将使用来自不同表的各种信息。我只是迷路了。任何帮助都将不胜感激!(显然,我想做一些类似的评论)


谢谢

我是否必须以不同于控制器的方式传递模型?


对。根据视图的需要创建一个模型(视图模型)。在那里填写正确的对象图(哪个博客指向哪个主题)。然后将实例化的对象传递到视图中,并在视图中引用这些对象。

不,不,不,不要将整个数据库传递给视图。您需要从数据库中提取视图数据。创建一个视图模型,该模型仅包含此视图所需的数据,其格式最适合视图使用。使用控制器或模型代码(取决于您相信胖控制器还是瘦控制器)将数据从数据库转换为视图模型。MVC的全部要点是分离关注点,如果您让数据模型泄漏到视图代码中,您将失去这一基本思想,并失去各层之间松散耦合的好处。

让您开始执行建议的操作过程。您的视图模型将是普通类:

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; }
}
公共类PostViewModel
{
公共字符串标题{get;set;}
public DateTime DateCreated{get;set;}
公共列表主题{get;set;}
公共列表注释{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);
}
public ActionResult Index()
{
//假设实体框架
List posts=(来自context.Set()中的p)
选择新的PostViewModel{
标题=p.标题,
DateCreated=p.DateCreated,
主题=p.主题
}).ToList();
返回视图(员额);
}
在你看来

@model List<PostViewModel>

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

    @foreach(Topic topic in post.Topics)
    {

    }
}
@型号列表
@foreach(模型中的Post)
{
@DisplayFor(m=>m.Title)
@foreach(post.Topics中的主题)
{
}
}

我想我还没有在一个控制器中遇到多个模型的例子。我所看到的一切都是一个基本功能。你能帮我找到正确的方向吗?谢谢大家!@pjb5064使用一个视图模型,但该模型包含所需的所有数据。例如,您的模型可以是PostViewModels的集合(或者更像一个页面模型,它包含一个页面的内容,以及您所在的页面、有多少页面等)。其中每一个都包含一篇文章的数据,包括一组CommentModel对象,这些对象表示该文章的评论。关键是,它们与实际实体是解耦的。这样,您的数据库更改不一定会传播到视图代码中。谢谢。正如你所看到的,我有很多东西要学。我大学毕业2年了,有一份工作,在.aspxweb表单上做一些基本的事情。那份工作最终没有成功,我强迫自己学习MVC3来创建一个博客,希望更多。在这里有很多教训可以吸取。。。我很感激你强调MVC的观点,我在这里尽量不偏离常规。啊,我开始理解了。“context.Set()”中的“context”是什么?上下文对我来说并不存在,我只是忽略了一些显而易见的东西吗?谢谢您的回复。@pjb5064。“上下文”是指实体框架的DBContext。我把它作为一个例子。基本上,你必须从某个地方获取数据,而获取数据的地方就在你的控制器中。好的。。。现在我每次尝试运行它时都会遇到一个错误(顺便说一句,“实体或复杂类型‘MvcBense.Models.BlogPost’不能在LINQ to Entities查询中构造。”不管。。。我在做“选择新帖子”而不是“选择新的PostViewModel”。。。谢谢你的帮助!我还有很多东西要学,快把我逼疯了。。。