【发布时间】:2012-06-14 22:18:13
【问题描述】:
我知道我的问题很愚蠢,但我不知道我的问题的解决方案,并且可以理解 stackoverflow 上的类似问题。 我在做简单的博客。 当我去这个博客中的一篇文章时,我必须看到他的文章和 cmets 的文本。它们在我的数据库中,但我不知道如何显示两者。 请帮帮我
【问题讨论】:
标签: asp.net-mvc-3
我知道我的问题很愚蠢,但我不知道我的问题的解决方案,并且可以理解 stackoverflow 上的类似问题。 我在做简单的博客。 当我去这个博客中的一篇文章时,我必须看到他的文章和 cmets 的文本。它们在我的数据库中,但我不知道如何显示两者。 请帮帮我
【问题讨论】:
标签: asp.net-mvc-3
您可以为此特定视图创建自定义 ViewModel。像这样的:
public class BlogReaderViewModel
{
// various fields which exist on either the post or the comments
}
然后您将绑定到该视图的视图模型。 Controller 操作将获取它需要的模型并构建 ViewModel 的实例以传递给 View。
另一种选择是使用a Tuple。它是一个泛型类,充当多种其他类型的强类型容器。所以 View 的 Model 应该是这样的:
Tuple<Post, Comments>
从整体设计的角度来看,我最大的建议是考虑您的模型如何相互关联并找到您的“聚合根”。对于带有 cmets 的博客文章,听起来文章应该是聚合根。模型本身应该包含 cmets。像这样的:
public class BlogPost
{
public string Title { get; set; }
public string Body { get; set; }
public IEnumerable<Comment> Comments { get; set; }
}
这个想法是聚合根是父对象并且内部知道它的子对象。您不必在每次想要使用对象时手动组合这些对象层次结构。
【讨论】:
你必须创建一个 ViewModel 来表示这个 View 或者这个 View 需要的数据,例如:
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
【讨论】:
这取决于模型中cmets的关系。通常 cmets 应该是帖子的子集合。因此,在视图中,您应该能够使用类似这样的东西(Razor)渲染 cmets:
@foreach (var comment in Model.Comments) {
// comments display goes here
}
确保当您将模型从控制器传递到视图时,您不会产生低效的查询。确保查询通过博客获取 cmets,具体取决于您在数据库中获取模型的方式。如果您使用 EF,那将是“包含”指令,例如
.Include(p => p.Comment);
【讨论】:
一种选择是创建一个复合模型来表示渲染视图所需的两组数据,并将每个子模型传递给视图本身的编辑器模板。
【讨论】: