如何有效地使用绑定框架

我一直在使用绑定框架一段时间了,我想知道你是如何处理这种情况的。

你有一份报纸有一些属性,如

  • (字符串)标题
  • (布尔)发表
  • (日期)发布日期

在您的视图中,您有一份报纸列表,而不是可以同时编辑。 这意味着您可以在单个请求中更改所有新闻文件的标题或其所有“已发布”状态。

问题是,当我们使用绑定框架时,​​您将编辑报纸的数据,就像您在数据库中编辑数据一样…将每个值绑定到一个字段,彼此独立。

但是……我想做的是,当我发布报纸时,发布日期更新到当前日期。 我可以肯定在表单上放置一个publishmentDate字段,甚至是设置为当前日期的隐藏字段……但这既不干净也不安全。

我认为最好有一个动作publish()将标志设置为true,但也更新publishmentDate(如果需要,还可以更新其他逻辑……)

我只是想知道你是如何处理的?

我已经看到并考虑过不同的方法:


1)有时我们将新参数绑定到现有的持久ORM实体。 这意味着我们在绑定之前检索实体,以便将值绑定到现有的“已填充”实体对象。 这有时被称为“保护实体”因此,知道是否必须启动“发布操作”的唯一方法是将旧字段与新字段进行比较,以便了解它是否已编辑以及在哪个方向上进行(false – > true = publish)可以使用ORM监听器(如@PostLoad,Hibernate Interceptor / EventListener或其他任何东西),以便保留这些“绑定前”值。

这很好用,但在车辆上启动发布操作非常“奇怪”,而绑定已经将已发布的标志设置为true。


2)可以做几乎相同的事情,但是使用另一个标志……例如,表示用户希望发布报纸的标志。 因此,您无需与之前的值进行比较,只需检查用户是否希望发布报纸然后启动操作…(此次启动操作时,实际发布的标志仍为= false。 ..)

问题是,当您使用绑定框架时,​​您希望在已查看已发布的报纸的视图上检查已发布的复选框。 因此,如果绑定属性现在已发布_wish,则必须将其设置为值,否则所有复选框将始终未选中…这意味着在显示视图之前,您将执行类似published_wish = published的操作。希望标志不会被持久化,但我看到一些情况下“愿望”必须坚持,因此不需要做发表_wish =已发表


3)使用空的非持久化实体进行绑定,然后将此非持久化实体的值重新复制到真实持久化对象。 因此,当您将值从一个对象重新复制到另一个对象时,您可以启动所需的任何操作,自定义所有内容……但是重新复制所有这些参数有点重…


可能还有其他方法……

你会怎么做? 所以它不仅运作良好,但它也优雅,可维护 ……我在这里看不到任何完美的解决方案

我同意你的观点,在这种情况下我也会使用发布按钮(可能还有“取消发布”按钮),允许用户选择多篇文章并一次发布。 我不允许用户直接编辑Published复选框和发布日期。

这个问题没有打开我,但如果你想要优雅地保存发布日期,你为什么不留下数据库为你做这件事。 在Mysql上你有一个示例,数据库自动为用户保存lastChanged数据。

数据库触发器也可以为您提供。 至少我看到自动确切的数据库查询比解决这些问题的代码中的一堆黑客更好的解决方案。

我希望这些回答你的问题,甚至是正确的问题。