1个视图中的2个模型

时间:2012-05-29 17:32:31

标签: asp.net-mvc-3

我知道我的问题很愚蠢,但我不知道我的问题的解决方案,并且可以理解stackoverflow上的类似问题。 我做简单的博客。 当我在这篇博客中发表一篇文章时,我必须看到他的帖子和评论文本。它们在我的数据库中,但我不知道如何显示它们。 请帮帮我

4 个答案:

答案 0 :(得分:1)

您必须创建一个ViewModel来表示此视图或此视图所需的数据,例如:

public class OrderViewModel {

   public int Id { get; set; }
   public DateTime DateOrder { get; set; }
   public decimal Total { get; set; }
   public string CustomerName { get; set; }

   public List<Item> Items { get; set; }

   // other properties     
}

你应该使用这个ViewModel来输入你的视图样本(使用剃刀):

@model Models.ViewModels.OrderViewModel

答案 1 :(得分:1)

这取决于模型中评论的关系。通常评论应该是帖子的子集合。所以在视图中你应该能够用这样的东西(Razor)渲染评论:

@foreach (var comment in Model.Comments) {
    // comments display goes here
}

确保从控制器将模型传递给视图时不会产生低效查询。确保查询获取博客的评论,具体取决于您在数据库中获取模型的方式。如果您使用的EF是“Include”指令,例如

.Include(p => p.Comment);

答案 2 :(得分:1)

您可以为此特定视图创建自定义ViewModel。像这样:

public class BlogReaderViewModel
{
    // various fields which exist on either the post or the comments
}

然后,您将绑定View的ViewModel。 Controller操作将获得所需的模型,并构建ViewModel的实例以传递给View。

另一种选择是使用a Tuple。它是一个泛型类,充当多种其他类型的强类型容器。因此View的模型将是这样的:

Tuple<Post, Comments>

从整体设计的角度来看,我最大的建议是考虑你的模型如何相互关联并找到你的“聚合根”。对于带有评论的博客文章,听起来帖子应该是聚合根。模型本身应该有评论。像这样:

public class BlogPost
{
    public string Title { get; set; }
    public string Body { get; set; }
    public IEnumerable<Comment> Comments { get; set; }
}

这个想法是聚合根是父对象,并在内部知道它的子对象。每次要使用它们时,都不必手动编写这些对象的层次结构。

答案 3 :(得分:0)

一个选项是创建一个复合模型,它表示渲染视图所需的两组数据,并将每个子模型传递给视图本身的编辑器模板。

相关问题