2

带有自己的表单的(Richfaces)弹出窗口提供了一个保存按钮,该按钮必须执行另一个表单(contentForm)并且如果发生验证失败则不转发。

然而,saveHandler.forward()总是被调用......有什么想法吗?

<a4j:commandButton 
    id="saveContentChanges" 
    value="Speichern" 
    action="#{cc.attrs.handler.save()}"
    type="submit"> 
    <a4j:ajax 
        execute=":contentForm" 
        render=":contentForm"
        oncomplete="if (#{!facesContext.validationFailed}) { saveHandler.forward() } else { #{rich:component('contentSaveHandlerPopup')}.hide() }"
        onerror="errorHandler.onError(event.description); #{rich:component('contentSaveHandlerPopup')}.hide();" />
</a4j:commandButton>

PS。此代码位于复合组件内。我在 JavaScript 控制台上没有收到任何错误。

4

1 回答 1

2

在 HTML 中,只能提交单个表单,因此在您的情况下,只有来自a4j:commanButton驻留表单的数据从客户端提交到服务器。execute属性仅影响服务器端处理,它不会改变数据的提交方式。因此,添加到execute不同的表单使其实际在服务器端进行处理,但由于没有提交的值,这意味着没有什么可以验证的。

替代解决方案是:

  1. (首选)将带有按钮的弹出窗口放在需要提交和验证的相同表单中。

  2. 将 a4j:jsFunction 放入 contentForm 并从弹出窗口中调用它,代码如下所示:

.

<h:form id="contentForm">
  .. other fields to be submitted ..
  <a4j:jsFunction name="executeContentFormAction" execute="@form" render="@form"
        action="#{...}"
        oncomplete="if ..."/>
</h:form>

...

<a4j:commandButton 
    id="saveContentChanges" 
    value="Speichern"
    onclick="executeContentFormAction(); return false;">
于 2013-08-21T16:15:17.843 回答