【问题标题】:Disable validation for immediate actions禁用即时操作的验证
【发布时间】:2014-02-19 23:28:00
【问题描述】:

我有一个复杂的页面,其中包含 p:commanButton 和 actionListener 和 immediate="true"

单击此命令按钮后,我需要处理单个 inputField(从而跳过表单的其余部分)。问题是,inputField 有一个验证器,我只想在整页提交中使用它。

<p:inputText id="#{cc.attr.id2}_input" value="#{myBB.value}" 
                 immediate="true">
    <f:validateLength minimum="4"/>
</p:inputText>

<p:commandButton id="#{cc.attr.id2}_search" immediate="true" 
     process="#{cc.attr.id2}_input @this"
     actionListener="#{myBB.listener}">
</p:commandButton>

当我使用 inputText 中的 3 个字母执行此操作时,由于验证失败,myBB.value 不会更新。所以我想禁用 inputField 的验证器,以便 commandButton 立即处理。但我不知道怎么做。

我知道我可以从ExternalContext 获得价值,但这对我来说似乎是一个非常老套的解决方案(在我的情况下甚至不适用,因为它在复合组件内部,我无法知道 clientId的文本字段。) 我也知道validator 标签的disabled 属性,但我不知道如何在这种情况下使用它。

编辑:我稍微更改了代码,因为我使用的 ID 实际上并不像我最初所说的那么简单,并且不允许我使用简单的建议解决方案。

我使用 Mojarra 2.2.4 和 Primefaces 4.0

【问题讨论】:

    标签: validation jsf primefaces


    【解决方案1】:

    所以,首先,immediate 没有问题,而是&lt;f:validateLength&gt; 验证器存在问题。

    也就是说,为了重新表述您的问题,您希望在点击特定按钮时跳过对给定组件的验证。

    根据您是否使用 Mojarra 2.1.18+,有两种解决方案。第一个非常简单:使用&lt;f:validateLength&gt; 的禁用属性,而另一个考虑issue 1492。由于我们现在已经超越了上述 Mojarra 版本,我将发布第一个更简单的解决方案,否则,滚动浏览 BalusC 对 Why does f:validateDoubleRange only work for @SessionScoped?Disabled attribute of <f:validateLength> does not evaluate request parameters 的出色答案。

    所以,解决方法如下:

    <h:form id="formId">
        <p:inputText id="inputId" value="#{myBB.value}">
            <f:validateLength minimum="4" disabled=#{not empty param['formId:buttonId']}" />
        </p:inputText>
        <p:commandButton id="button" process="@this inputId" actionListener="#{myBB.listener}" />
    </h:form>
    

    作为旁注,您可以看到我根本没有使用immediate 属性,因为我认为您滥用它来执行给定的任务。随着 AJAX 的兴起,特别是在基于 JSF 的应用程序中,您现在可以通过指定 &lt;p:commandButton&gt;&lt;p:ajax&gt;process 属性而不是以前使用的优先级验证,特别是在同步请求中,轻松地对输入元素验证的子集进行分组。只有那些提供了 id 的组件将在服务器上处理,所有其他组件将被省略 prom 处理生命周期。另请注意,process="@this ..." 也是执行与其按钮相关联的操作所必需的。

    关于immediate的正确使用我强烈建议参考经典:BalusC的Debug JSF lifecycle博文,看看你是否正确使用。

    【讨论】:

    • 谢谢。这看起来不错,但我对formId:buttonId 有一个小问题。我已将示例精简到最少,但实际上按钮 ID 的 id 是这样组成的:#{cc.attrs.id2}_search。有没有办法把它写成param的值?
    • 我认为您的回复是可以接受的。我刚刚对其进行了更新,以更清楚地说明我的其他问题出在哪里。
    猜你喜欢
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    相关资源
    最近更新 更多