【问题标题】:View Models: Data Duplication VS Performance查看模型:数据重复 VS 性能
【发布时间】:2013-11-17 06:15:55
【问题描述】:

我正在学习 MVC 并且有一个想法,我想请一些意见。

我正在制作一个简单的社交网络来学习 MVC。有用户和帖子。每个用户的墙上可以有许多帖子(来自他们自己和其他用户)。这些是我的领域模型

**USER**
UserID
Username
First Name
Second Name
WallID

**POST**
PostID
WallID (id of user who's wall has been posted to)
UserID (user who posted)
PostConent

现在我试图理解视图模型。而且我认为我没有正确理解它们,根据我目前的理解来获取帖子作者的用户信息,我将制作两个新模型来组合页面上的数据:

**POSTExtended**
PostID
WallID (id of user who's wall has been posted to)
UserID (user who posted)
PostConent
Username
FirstName
SurName

**WallViewModel**
PostExtended postExtended = new PostExtended
User user = new User

现在我不确定如何填充它。我目前最好的猜测听起来像是可行 - 但听起来肯定不对!

我会创建一个绑定到 wallViewModel 的控制器。

然后我会查询数据库以获取相关 WallID 的所有帖子并将它们存储在对象列表中。

然后,我将使用 foreach 循环查询列表中每个帖子的用户表 - 获取该 PostID 的用户名和用户名,并将它们添加到新的 PostExtended 对象(使用来自原始帖子的其他数据对象),并将它们存储在后扩展对象列表中。

然后我会点击数据库来获取 wallViewModel 的用户对象(帖子所属的用户),这样我就可以在标题等中显示他们的名字。

然后我将添加用户对象并将 PostExtended 对象列表添加到 WallViewModel 对象。并将该对象发送到视图。

现在这听起来对我来说是错误的,因为据我所知,这意味着每个帖子都要单独访问数据库以获取用户名。

请有人对此有所了解。听起来必须有一种更简单的方法来做到这一点! (如果这是正确的方法,那么在帖子表中复制数据以节省每次循环访问数据库会更好吗?)。

希望这是可以理解的!谢谢

【问题讨论】:

    标签: asp.net-mvc entity-framework asp.net-mvc-4


    【解决方案1】:

    视图模型是一种组合不同数据源并将自定义信息发送到视图的方法。在这种情况下,您需要的是一个模型,它只有一个用户,但有一个帖子列表。像这样的

    ** WallViewModel **
    User user
    List<User> userList
    List<Post> posts
    

    这样您就拥有了该用户的所有帖子,但用户信息仅存在一次且不会重复。如果您有任何问题,请告诉我

    编辑:

    我现在明白了。由于您在每个页面上有多个用户和多个帖子,我会发送页面所有者(单个)和在页面上有帖子的用户列表。然后循环浏览帖子,从帖子上的用户 ID 中,您可以从 userList 中选择相应的用户信息。希望这会有所帮助

    【讨论】:

    • 您好,感谢您抽出宝贵时间 - 非常感谢。也许我不清楚。每个帖子都有一个作者,该作者作为 UserID 存储在 Posts 表中。我需要获取每个帖子的作者(用户)信息 - 这将是与墙的用户不同的用户。与在朋友 Facebook 墙上发帖的用户几乎相同。你的方法会包含所有用户的用户名吗?
    • 他的方法是一个完全控制的方法,你的 ViewModel 将包含你想要传递给你的视图的任何数据。您定义需要发送到视图的内容。如果您需要有关已登录用户的信息以及来自任何用户的帖子的信息,您如何定义视图可以让您完全控制。
    • @Matt 所以如果我理解正确 - 我会得到帖子列表,然后从该帖子列表中的用户 ID 查询数据库以获取用户列表(在帖子列表中有用户 ID 的人) .然后从用户列表中获取用户信息?
    • 因为你的用户和帖子有一个墙ID,你应该能够只运行2个查询来获取该墙上的所有帖子和用户,将它们放在视图模型中并将它们传递给视图。您不能假设墙的所有者会发布,因此您可能需要单独查询他们
    • 这是有道理的。再次感谢您的帮助。
    【解决方案2】:

    添加到 Matt Bodily 的答案中,您的 ViewModel 将类似于:

    public class LoggedInUserViewModel
    {
       property int UserId;
       property string UserName;
       property List<ViewModelPosts> Posts;
    }
    
    public class ViewModelPosts
    {
       property int AuthorUserId;
       property string AuthorName;
       property string Message;
       property DateTime CreatedDate;
    }
    

    在您的控制器中,您只需创建一个 LoggedInUserViewModel 的新实例,并使用数据库调用和帖子/消息的 foreach 循环正确填充它。 foreach 的每次迭代都会创建一个新的 ViewModelPosts 实例,并将填充的实例添加到 LoggedInUserViewModel List 属性中。

    可以将模型类直接传递给视图,但这不能很好地适应视图上下文。 View 正在寻找/期望以更有意义的方式组合数据库中的数据,因此 ViewModels 通过组合彼此相关的模型类来帮助在模型/数据库的基本结构和 View 所需的更复杂结构之间进行转换控制器中的一种有意义的方式,您的视图不必了解数据库/模型中的实际数据关系。

    【讨论】:

    • 谢谢布莱恩。您的解释帮助我理解了 matts 解决方案。
    • 没问题!很高兴你有更好的理解,这总是感觉很好;)。
    猜你喜欢
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2023-03-18
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多