【问题标题】:Does a ViewModel have its own logic?ViewModel 有自己的逻辑吗?
【发布时间】:2010-01-29 02:41:56
【问题描述】:

在分配 ViewModel 字段时,是否应该将域对象直接传递给 ViewModel 对象,然后由后者确定如何呈现数据,或者是否应该像服务这样的另一个类将数据从 Model 分配给 ViewModel?

还有:

编辑:将视图模型分为接收者和演示者有什么意义吗? (而不是在更新时仅绑定某些字段?)

【问题讨论】:

标签: asp.net-mvc viewmodel


【解决方案1】:

通常,Controller Action 获取业务对象并放置视图模型所需的任何内容。

如果您的业务对象包含字段名称、地址、ID 并且视图应该只显示名称,那么视图模型只有一个字段“名称”,并且控制器操作会填充它。 ViewModel 应该对您的业务类一无所知,它应该只知道它需要显示的内容。

主要/唯一逻辑是“显示逻辑”,即“如果 TotalAmount 为负数,则使用 CSS ClassnegativeNumber 显示”。

【讨论】:

  • 将视图模型分为接收者和演示者有什么意义吗?
  • 我几乎没有 MVP 类型模式的经验,但我认为没有太多需要。由于 Controller Action 创建 ViewModel,“Receiver”部分应该只包含一些轻量级验证,并且大部分 Presenter 逻辑是实际的 View Page(如果您使用默认的 WebForms View Engine,则为 YourView.aspx)。如果您在 ViewModel 类中执行繁重的条件逻辑,也许您应该将其提取到一个单独的类中(如果由多个 ViewModel 共享)。真的,视情况而定,但通常 ViewModel 非常轻量级。
  • 如果逻辑在视图中显示性别呢?假设你将 M 和 F 保存在数据库中,当在视图中显示时,逻辑 if gender.Equals("M") return "Male"; else "Female" 应该放在 ViewModels、Repository 中还是映射到 ViewModels 时?
  • @Willy 我可能会直接将它放在视图中(我不反对视图中的 if/then/else)或 HtmlHelper(如果它在多个视图中使用)(“GetDisplayGender(string dbGender) ") 或其他一些助手。我认为存储库不是正确的位置,除非 Gender 是一个枚举并且您从“M”映射到 Gender.Male。此外,本地化可能会限制放置位置。我想这可以归结为:您的应用程序中需要处理显示名称的“最低”级别是什么?
【解决方案2】:

为了 SoC,如果该逻辑与 View 相关,则它们可以安全地位于 ViewModel 甚至 View 本身中,但如果它们与业务或程序相关,则将它们分别放在 Model 和 Controller 上。

【讨论】:

  • +1,虽然 ViewModel 通常可能是 POCO,但在需要时向它们添加视图逻辑,而不是在控制器中执行,从而保持事物干燥。
【解决方案3】:

根据我的经验,我使用服务将模型映射到视图模型。我没有在我的 ViewModel 中添加逻辑。

顺便说一句,您不妨看看AutoMapper 来帮助您进行映射。绝对有助于减少编写重复的映射逻辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多