0

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

4

4 回答 4

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
于 2012-05-29T17:36:28.667 回答
1

这取决于模型中注释的关系。通常评论应该是帖子的子集合。因此,在视图中,您应该能够使用以下内容(Razor)呈现评论:

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

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

.Include(p => p.Comment);
于 2012-05-29T17:40:37.793 回答
1

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

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

然后,您将绑定到该视图的视图模型。Controller 操作将获取它需要的模型并构建 ViewModel 的实例以传递给 View。

另一种选择是使用Tuple. 它是一个泛型类,充当多种其他类型的强类型容器。所以视图的模型会是这样的:

Tuple<Post, Comments>

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

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

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

于 2012-05-29T17:40:49.483 回答
0

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

于 2012-05-29T17:34:40.233 回答