表单内的表单:跳过父表单的验证

时间:2011-04-14 15:20:37

标签: jsf jsf-2

<h:form prependId="false" id="parentForm">
    ...
    <h:form prependId="false" id="commentForm">
        ...
        add comment
    </h:form>
    save
</h:form>

不起作用......

如果没有内部形式,当我只想添加注释时,父元素会被验证 “添加评论”应该只是验证评论,当点击“保存”时,应验证父级。

1 个答案:

答案 0 :(得分:12)

嵌套表单在HTML中是非法的,因此在JSF中也是如此,因为它只是生成HTML。你需要把它们放在一起。

如果您在同一表单中有多个按钮,您希望在按某个按钮时跳过某些验证,则将immediate="true"添加到相关按钮。这样,将跳过的所有输入字段immediate="true"

另见:


更新:好的,您希望在单个表单中包含两个物理上独立的表单。如果将“神形式”分成多种形式并且各自自己的责任不是一种选择,那么有几种方法可以解决这个问题:

如果您不使用Ajax并且在输入元素上只有一个required="true",当您按某个按钮时,您实际上不需要该输入元素,那么请执行以下操作:

<h:form>
    ...
    <h:commandButton value="Submit form but but do not validate comment" />
    ...
    <h:inputTextarea id="comment" required="#{not empty param[foo.clientId]}" immediate="true" />
    <h:commandButton binding="#{foo}" value="Submit and validate comment" immediate="true" />
</h:form>

如果您实际使用Ajax,则只需在execute属性中指定执行区域。

<h:form>
    <h:panelGroup id="other">
        ....
        <h:commandButton value="Submit form but but do not validate comment">
            <f:ajax execute="other" render="other" />
        </h:commandButton>
    </h:panelGroup>
    <h:panelGroup id="comments">
        <h:inputTextarea required="#{not empty param[foo.clientId]}" />
        <h:commandButton value="Submit and validate comment by ajax">
            <f:ajax execute="comments" render="comments" />
        </h:commandButton>
    </h:panelGroup>
</h:form>