gpt4 book ai didi

JSF 如何临时禁用验证器以保存草稿

转载 作者:行者123 更新时间:2023-12-04 01:06:34 25 4
gpt4 key购买 nike

我有一个非常复杂的表单,有很多输入和验证器。对于用户来说,完成它需要很长时间(甚至一个多小时),因此他们希望能够保存草稿数据,即使它违反了诸如未输入必填字段之类的规则。

我相信这个问题对于许多 Web 应用程序来说是常见的,但是找不到任何公认的模式应该如何实现。你能建议如何实现这一目标吗?

现在我可以看到以下选项:


  • 在“保存草稿”按钮上使用immediate=true 不起作用,因为UI 数据不会存储在bean 上,所以我将无法访问它。从技术上讲,我可以在 UI 组件树中找到数据,但遍历它似乎不是一个好主意。

  • 从页面中删除所有字段验证,并在为表单定义的操作监听器中以编程方式验证数据。同样,这不是一个好主意,表单真的很复杂,有很多字段,因此以这种方式实现验证会非常困惑。

  • 实现我自己的验证器,该验证器将由某些请求属性控制,该属性将设置为标准表单提交(需要完全验证),并且将取消设置为“另存为草稿”提交(应跳过验证时)。同样,这不是一个好的解决方案,我需要为我使用的所有验证器提供我自己的包装器。

  • 但正如你所见,没有人是真正合理的。这个问题真的没有简单的解决办法吗?

    最佳答案

    确实没那么容易。验证在 JSF 生命周期中非常紧密地耦合在一起。

    我个人会选择选项 1。确实,肮脏的工作,但您可以将其隐藏在实用程序类中。只需捕获 <h:form>来自 View 根的问题,递归迭代其子项,从而测试是否 component instanceof EditableValueHolder为真,将找到的 id-value 对存储在 Map 中并最终坚持下去。

    作为第四种选择,您可以使用ajaxical powers 独立保存所有数据。 jQuery在这方面很有帮助。

    $.post('/savedraft', $('#formid').serialize());

    它只需要客户端的 Javascript 支持。

    更新 :JSF 实用程序库 OmniFaces有一个 <o:ignoreValidationFailed> taghandler 用于确切目的。这确实不是一个简单的解决方案,因为它需要自定义 <h:form>以及。它通过提供自定义 FacesContext 来完成它的工作。在验证和更新模型值阶段的实例,在 validationFailed() 中执行 NOOP和 renderResponse()方法。所以组件仍然无效并且消息仍然附加,但它仍然会继续更新模型值并调用应用程序阶段。

    关于JSF 如何临时禁用验证器以保存草稿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2780903/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com