【问题标题】:2 models in 1 view [duplicate]1 个视图中有 2 个模型 [重复]
【发布时间】:2012-06-14 22:18:13
【问题描述】:

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

【问题讨论】:

    标签: asp.net-mvc-3


    【解决方案1】:

    您可以为此特定视图创建自定义 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; }
    }
    

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

    【讨论】:

      【解决方案2】:

      你必须创建一个 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
      

      【讨论】:

        【解决方案3】:

        这取决于模型中cmets的关系。通常 cmets 应该是帖子的子集合。因此,在视图中,您应该能够使用类似这样的东西(Razor)渲染 cmets:

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

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

        .Include(p => p.Comment);
        

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-02-05
            • 2015-10-30
            • 2011-12-05
            • 1970-01-01
            • 1970-01-01
            • 2020-08-08
            • 2018-05-19
            • 2013-10-01
            相关资源
            最近更新 更多