【发布时间】:2013-08-28 19:37:54
【问题描述】:
我有一个禁用某些表单的复选框。
<h:selectBooleanCheckbox id="ldapAuthEnabled" value="#{enabled}" label="check it">
当我检查它时 - 它会导致我的表单中的所有字段都被禁用,因此:
<h:inputText mandatory="true" value="#{someVar}"
disabled="#{!enabled}" required="#{enabled}" />
问题来了
- 当字段未禁用时,我会尝试保护我的表单 - 它会显示验证消息!
- 然后我点击复选框,它使所有字段都被禁用,但是 - 它仍然显示验证消息!因此,它甚至无法访问我的 controller.safe() 方法。
问题是:如何让它按预期工作? - 当字段被禁用时,无需保留验证消息并认为表单无效。
-- 编辑:
正如答案中所建议的(来自 BalusC),我将“值”更改为“绑定”,所以现在我有这样的代码:
<h:panelGroup id="my-panel">
<h:selectBooleanCheckbox id="myEdit" binding="#{checkbox}" label="enable it!">
<f:ajax event="click" render="my-panel"/>
</h:selectBooleanCheckbox>
<h:inputText id="name" value="#{bean.name}" disabled="#{not checkbox.value}" required="true" />
<h:outputText value="sometext"/>
</h:panelGroup>
"<h:panelGroup id="my-panel">" 是“表单”的一部分。
但结果相同 - 验证错误阻止我执行 save()。
我现在为我的 bean 使用“SessionScope”。
【问题讨论】:
-
这是真实的代码吗?我没有看到任何与模型的值绑定。例如。
#{bean.enabled}。请以 SSCCE 风格发布代码。到目前为止,这些症状表明条件存储在请求范围而不是视图范围中和/或没有使用 JSF ajax 来更新表单。 -
是的,我也考虑过请求范围。但在大多数情况下,将表单值保留在会话范围内以确保用户刷新页面时的安全是非常有用的。(关于代码:我只是将其简化了一点。但它是真实的)
-
-
好的,但以后请学习如何创建 SSCCE。将代码复制粘贴到完全空白的非模板页面的
<h:body>时,代码必须是可复制的“n'paste'n'runnable(由您自己!!)未经修改,以便重现/演示所需的问题。另见stackoverflow.com/tags/jsf/info
标签: validation jsf