【问题标题】:Can the data transfer object`s data match the UI needs数据传输对象的数据能否匹配 UI 需求
【发布时间】:2013-10-31 19:10:36
【问题描述】:

数据传输对象保存从多个业务对象发送到客户端的数据。

但是该数据及其结构是否应该/可以为客户端进行额外设置以满足其绑定需求?

或者我应该为此额外创建一个 ViewModel 吗?

它是一个小型应用程序,所以我对过多的过度架构犹豫不决,并且 dto 将与视图模型 90% 相同...

DTO 会从一个 RESTful 服务器转移到一个 javascript 客户端,而不是更多。

【问题讨论】:

    标签: asp.net-web-api viewmodel dto data-transfer-objects


    【解决方案1】:

    我认为要考虑的是 VM 和 DTO 之间存在哪些差异。不久前,我试图创建 C# 视图模型,它实现、派生或包含 DTO 契约以及所有以视图为中心的东西,例如选择列表选项和过滤器属性。我发现这很麻烦,脆弱和潮湿(与干燥相反;)。

    从那以后,我开始采用一种在 JavaScript 中定义我的视图模型并允许 DTO 对象仅包含满足服务层的合同期望所必需的属性的模式。我使用 ajax 拉取数据。数据通常以从服务接收到的格式传递到视图中。然后我更新我的数据绑定、可观察的剔除视图模型。到目前为止,这种模式对我来说非常有效。

    关于输入验证,只要我们谈论的是验证属性,我认为在 DTO 上定义验证属性是完全可以的。毕竟,您的 API 控制器有一个 ModelState 是有原因的。不幸的是,没有一种非常好的方法可以将该验证转换为您的客户端绑定视图。因此,我一直倾向于淘汰验证而不是 MVC 的验证。但是,我仍然希望有更好的解决方案验证解决方案!

    【讨论】:

    • 你提到 ajax/knockout 很好,因为我也在客户端使用它们。事件更多我做一个SPA,我面临很多WET,比如客户端和服务器端的ViewModels......或者更干燥的方式并在服务器端使用DTO,在客户端使用viewmodels(无论如何我都需要它们)。是的,对于输入验证,我的意思是验证属性(数据注释属性)或 FluentValidation,它们在 asp.net mvc 中对我来说效果很好。好吧,knockoutjs 验证很好,但它的客户端(不安全)我也需要适当的服务器端验证(modelstate)
    【解决方案2】:

    我喜欢将我检索到的表示视为我的 ViewModel 的有线表示。在许多情况下,不需要区分 ViewModel 和 DTO。

    【讨论】:

    • 结果是我的结构化 DTO 将是我的服务器端的输入验证模型,例如网络 API 控制器。你还同意吗?
    • @Elisa 我不在客户端和服务器之间共享类型,所以我不会遇到这个问题。我也不将读取和写入视为对称操作。但是,对于简单的场景,您可能可以在 viewmodel/DTO 上添加输入验证。
    猜你喜欢
    • 2020-08-02
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 2022-05-05
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 2023-02-11
    相关资源
    最近更新 更多