【问题标题】:How should I implement a UI for IsDirty using the Model-View-Presenter pattern?我应该如何使用 Model-View-Presenter 模式为 IsDirty 实现 UI?
【发布时间】:2010-12-31 05:43:39
【问题描述】:

我想要一个仅在视图脏时启用的保存按钮。我应该如何处理?

我的特殊情况是使用 .Net 2.0 的 WinForms 应用程序。我有一个演示者调用的服务层。服务层返回一个屏幕绑定的 DTO。

是否可以将视图绑定到此 DTO 并让 DTO 实现 isDirty 属性?或者我应该将数据从 DTO 卸载到另一个专门为演示目的设计的对象中,例如视图模型?

【问题讨论】:

  • “MVP”相当广泛......什么平台/语言/架构?
  • @Marc 希望这可以提供更多详细信息,以便您做出回应

标签: .net model-view-controller mvp


【解决方案1】:

视图永远不应该是脏的。只有你的模型。

然后,您可以简单地设置一个在模型变脏时触发的事件,以及在模型变干净时触发的事件。

【讨论】:

  • 这是我最初的想法。模型会变脏,视图可以反映这一事实。所以我会假设模型必须实现一个 isdirty 属性。
【解决方案2】:

这就是我所做的,视图本身可以跟踪用户是否尝试修改数据。发生这种情况时,它可以通知演示者视图数据已更改,并且演示者可以对此事件采取行动以启用/禁用保存按钮。这是迄今为止我发现的最简单的解决方案,否则您必须对 DTO/Data 对象本身进行更改跟踪。

【讨论】:

    【解决方案3】:

    您能否让所有控件在调用 _presenter.MarkDirty() 或类似方法时启用更改时自动回发。

    或者您可以允许使用保存按钮,但如果对象是干净的,则以未更改对话框或类似的方式响应。

    【讨论】:

    • Autopost back 可能不是 WinForms 中最正确的词,但它至少应该传达我的观点。
    【解决方案4】:

    我同意@Pace 的观点,即只有模型应该是脏的。

    我只想在这里添加(因为这似乎是关于 .net),您可以使用 CSLA 来实现您的模型,并且您可以免费获得 IsDirty 功能(和许多其他东西)。

    更新:

    CSLA 与业务层无关吗?

    确实是的,但我认为 IsDirty 方法属于业务层。您谈到在您的 DTO 上实现 IsDirty,但是当您这样做时,该对象不再是 DTO(因为它不仅仅是传输数据)。

    此外,您可以使用 CSLA 作为 DTO 和表示层之间的中间层,尽管如果您的意图只是使用 IsDirty 功能,这会有点过多的开销。

    关键是:当您开始将“功能”放入 DTO 时,我不明白您为什么不从业务层公开 CSLA 对象而不是简单的 DTO。

    【讨论】:

    • CSLA 与业务层无关吗?我提出的问题是关于演示的。我的业务对象没有暴露给表示层。
    • @fretje 我同意,一旦我将 isDirty 属性放入 DTO,它就不再是 DTO。因此,在此基础上,我认为这样做确实是错误的,这就是为什么我问是否会从 DTO 中提取数据并将其推送到另一个对象中以进行演示。我的特定实现不会将域对象暴露给表示层,因为我非常喜欢这种方法,尽管我知道关于这个主题有很多争论。
    猜你喜欢
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    相关资源
    最近更新 更多