Validation 跳过第二个表单提交上的无效字段

Validation 跳过第二个表单提交上的无效字段,validation,primefaces,jsf-2.2,Validation,Primefaces,Jsf 2.2,当验证失败时,我希望通过在第二次提交时忽略无效字段来提交表单。孤立的问题如下: 我的表单包含两个必需的输入foo和bar,这两个输入在h:hiddenInput中进行额外验证,以及一个名为MyValidator的自定义验证器,例如,它确保了输入的不平等性。如果MyValidator失败,我将显示另一个提交按钮,该按钮通过仅处理输入foo和bar跳过h:hiddenInput及其验证器 <h:form> <h:panelGroup layout="block" id="f

当验证失败时,我希望通过在第二次提交时忽略无效字段来提交表单。孤立的问题如下:

我的表单包含两个必需的输入
foo
bar
,这两个输入在
h:hiddenInput
中进行额外验证,以及一个名为
MyValidator
的自定义验证器,例如,它确保了输入的不平等性。如果
MyValidator
失败,我将显示另一个提交按钮,该按钮通过仅处理输入
foo
bar
跳过
h:hiddenInput
及其验证器

<h:form>
    <h:panelGroup layout="block" id="fooBarWrapper">
        <p:inputText value="#{myControl.foo}" binding="#{foo}" required="true"/>
        <p:inputText value="#{myControl.bar}" binding="#{bar}" required="true"/>
    </h:panelGroup>

    <h:inputHidden validator="myValidator" binding="#{myValidation}">
        <f:attribute name="foo" value="#{foo}"/>
        <f:attribute name="bar" value="#{bar}"/>
    </h:inputHidden>

    <p:messages/>

    <p:commandButton action="#{myControl.doSomething()}" value="Do something" 
                     process="@form" update="@form" 
                     rendered="#{myValidation.valid}"/>

    <p:commandButton action="#{myControl.doAnotherThing()}" value="Do another thing" 
                     process="fooBarWrapper" update="@form"
                     rendered="#{not myValidation.valid}"
                     oncomplete="if (!args.validationFailed) { console.log('valid'); }"/>
</h:form>

但是,第二个按钮的操作没有被调用,尽管现在按照预期跳过了
MyValidator
。有趣的是,PrimeFaces
args.validationFailed
表示验证成功


谁能解释一下,为什么没有调用
#{myControl.doAnotherThing()}
,尽管验证似乎没有失败?

这个问题与h:inpurthidden的验证器没有任何关系。 你可以把你的例子写得更详细

<h:form>
    <h:panelGroup layout="block" id="fooBarWrapper">
        <p:inputText value="#{myControl.foo}"/>
        <p:inputText value="#{myControl.bar}"/>
    </h:panelGroup>

    <p:messages/>

    <p:commandButton action="#{myControl.doAnotherThing()}" value="Do another thing" process="fooBarWrapper" update="@form"/>
</h:form>

这个例子也行不通。 要实现这一点,您还必须处理commandButton

<p:commandButton action="#{myControl.doAnotherThing()}" value="Do another thing" process="@this fooBarWrapper" update="@form"/>


您是否尝试过在第二个
命令按钮上设置
immediate=“true”
,以及
-
过程中属性值的作用,即
-{p:component('fooBarWrapper')}
,您可以简单地设置
process=“fooBarWrapper”
。另外,如果您正在调用一个无参数bean方法,则无需添加
()
。(1.)那
-
就是我的
javax.faces.SEPARATOR\u CHAR
,因为我不需要在任何jQuery选择器中转义它。然而,
process=“fooBarWrapper”
在这里绝对足够了。我更新了我的问题。非常感谢。(2.)我看不出
immediate=“true”
在这里能帮我什么忙。正如中所指出的,这将忽略所有没有
immediate=“true”
的输入。但我确实想把它们包括在我的提交表格中。
<h:form>
    <h:panelGroup layout="block" id="fooBarWrapper">
        <p:inputText value="#{myControl.foo}"/>
        <p:inputText value="#{myControl.bar}"/>
    </h:panelGroup>

    <p:messages/>

    <p:commandButton action="#{myControl.doAnotherThing()}" value="Do another thing" process="fooBarWrapper" update="@form"/>
</h:form>
<p:commandButton action="#{myControl.doAnotherThing()}" value="Do another thing" process="@this fooBarWrapper" update="@form"/>