为可重用 JSF 弹出窗口中有条件禁用的字段提交的空值

Null value submitted for a conditionally disabled field in a reusable JSF popup

我有一个用 IceFaces 1 开发的弹出对话框。8.x (JSF 1.2)。

该对话框可重复使用(用于帐户创建和修改)并且有一个带 immediate = true 的取消按钮(以避免验证)。这个对话框在过去遇到了一个问题,在重新打开对话框时会呈现旧值,但是这个问题现在已经按照指示 here 解决了( 通过将 submittedValue 设置为 null 等.).

我现在面临的问题是特定于有条件禁用 输入字段 (<ice:inputText>) 的,下面是发生的情况:

  1. 首先打开弹出窗口(比如创建帐户)和此字段 未禁用。
  2. 用户然后取消此对话框,并且由于我们合并了上述修复 (setSubmittedValue(null)),此字段的 submittedValue 设置为 null(以及其他字段)。
  3. 现在用户打开 "modify account" 对话框,其中该字段被禁用。在用户对表单进行任何更改之前,一切似乎都很好。
  4. 当用户更改表单中的某些字段(例如名称)时,名称字段会按预期进行部分提交,但同时会为该禁用字段提交空值。

可以通过在相关字段的 setter 方法中添加空检查来解决此问题,但这不是该项目所需的解决方案 - 因为有多个地方可能需要并且不需要这似乎不是一件很直观的事情。

所以我需要理解:

  1. 为什么在 第一名?那也有一个空值。二传手不是 调用任何其他启用的字段。
  2. 更重要的是,有什么方法可以解决这个问题(除了在 setter 中添加 null 检查之外)吗?

您必须在 show/hide 对话框中使用 rendered 属性

<ice:panelPopup modal="true" rendered="#{bean.enabled}">

当对话框重新打开时,它会从之前的实例中得到一些剩余值

解决方案(或解决方法)是使用 <c:if> 而不是 rendered 属性,这样 DOM 在对话框关闭时完全销毁并在对话框打开时从头开始创建

<c:if test="#{bean.enabled}">
    <ice:panelPopup modal="true">
    ...
    </ice:panelPopup>
</c:if>

这样您甚至不需要将 submittedValue 设置为 null

的修复程序