【问题标题】:Prevent validation messages appeared if fields are disabled如果字段被禁用,防止出现验证消息
【发布时间】: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}" />

问题来了

  1. 当字段未禁用时,我会尝试保护我的表单 - 它会显示验证消息!
  2. 然后我点击复选框,它使所有字段都被禁用,但是 - 它仍然显示验证消息!因此,它甚至无法访问我的 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>

"&lt;h:panelGroup id="my-panel"&gt;" 是“表单”的一部分。

但结果相同 - 验证错误阻止我执行 save()。

我现在为我的 bean 使用“SessionScope”。

【问题讨论】:

  • 这是真实的代码吗?我没有看到任何与模型的值绑定。例如。 #{bean.enabled}。请以 SSCCE 风格发布代码。到目前为止,这些症状表明条件存储在请求范围而不是视图范围中和/或没有使用 JSF ajax 来更新表单。
  • 是的,我也考虑过请求范围。但在大多数情况下,将表单值保留在会话范围内以确保用户刷新页面时的安全是非常有用的。(关于代码:我只是将其简化了一点。但它是真实的)
  • 好的,但以后请学习如何创建 SSCCE。将代码复制粘贴到完全空白的非模板页面的&lt;h:body&gt; 时,代码必须是可复制的“n'paste'n'runnable(由您自己!!)未经修改,以便重现/演示所需的问题。另见stackoverflow.com/tags/jsf/info

标签: validation jsf


【解决方案1】:

具体的功能需求是合理的,但是到目前为止发布的代码是如此奇怪和不完整,以至于很难解释它的具体问题。到目前为止,您所做的从理论上讲是行不通的,因为模型值仅在更新模型值阶段更新,而禁用/必需属性在应用请求值和验证阶段之前很久就被检查。

基本上,您应该将复选框值绑定到位于视图范围内的模型中的布尔属性,如下所示:

<h:selectBooleanCheckbox value="#{bean.enabled}" />
<h:inputText required="true" disabled="#{not bean.enabled}" />

或者至少像这样在视图中检查物理复选框组件本身:

<h:selectBooleanCheckbox binding="#{checkbox}" />
<h:inputText required="true" disabled="#{not checkbox.value}" />

当复选框被(取消)选中时,不要忘记提交值和 ajax 更新表单。我也没有在您的尝试中看到这一点。总而言之,这个完整的 copy'n'paste'n'runnable kickoff 示例应该可以帮助您入门:

<h:form>
    <h:selectBooleanCheckbox binding="#{checkbox}">
        <f:ajax render="@form" />
    </h:selectBooleanCheckbox>

    <h:inputText required="true" disabled="#{not checkbox.value}" />
    <h:inputText required="true" disabled="#{not checkbox.value}" />
    <h:inputText required="true" disabled="#{not checkbox.value}" />

    <h:commandButton value="submit" />
    <h:messages />
</h:form>

另见:

【讨论】:

  • 问题更多是关于为什么它在禁用表单时显示验证消息,而不是关于如何将复选框与模型绑定。
  • 因为它在应用请求值阶段没有被禁用。您是否阅读并理解了答案?您是否尝试过给定的启动示例?
  • 然后代码中还有其他原因导致此问题,目前为止提供的信息中不可见。它至少适用于我在一个完全空白的游乐场项目中使用 Mojarra 2.1.25 以及上面带有 action="#{bean.save}" 按钮的代码。
  • 也许我应该在面板上渲染时包含要更新的“”?因为我的“消息”不在面板中。
  • 这不可能阻止调用动作方法。你真的没有代表你创建一个SSCCE......??您如何能够正确地向他人展示问题,而不能仅用技术术语来理解和解释问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-28
  • 1970-01-01
相关资源
最近更新 更多