即使输入无效,Ajax回调onstart也能正常工作

时间:2012-01-21 13:29:15

标签: java ajax jsf java-ee primefaces

我在<h:form>内有输入字段和命令按钮。输入字段是必需的,如果输入了无效内容,则验证错误消息将显示良好。在表单的最后,我有以下按钮:

<p:commandButton value="" ajax="true" update="foormm"
    icon="ui-icon-check" actionListener="#{bean.sayHello}"
    onstart="dialog.show()"
    oncomplete="handleAjaxResponse(xhr, status, args)">
</p:commandButton>

问题是,无论验证如何,对话框都会显示。我认为如果验证了iff输入,则会发出Ajax请求。这有什么不对?即使必填字段为空,为什么onstart会被触发?

我在Eclipse中使用JSF 2.0,Primefaces 3.0和Weblogic 12.1。

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:1)

换句话说,只有在回发后没有发生验证错误时才要显示对话框? onstart根本没有考虑到这一点。它是在调用ajax回发之前调用的。

你需要采用不同的方法。 <p:dialog>具有visible属性,可以将EL表达式评估为boolean结果。你可以利用它:

<p:dialog id="dialog" visible="#{some condition}">

#{some condition}最简单的可以是FacesContext#isPostback()FacesContext#isValidationFalied()的组合。因此,如果它是回发并且验证没有失败,那么对话框应该是可见的。

<p:dialog id="dialog" visible="#{facesContext.postback and not facesContext.validationFailed}">

您只需让按钮更新该对话框:

<p:commandButton value="" ajax="true" update="foormm dialog"
    icon="ui-icon-check" actionListener="#{bean.sayHello}"
    oncomplete="handleAjaxResponse(xhr, status, args)">
</p:commandButton>

或者,您也可以让对话框的visible条件依赖于您在action(listener?)方法中设置的某些bean属性:

<p:dialog id="dialog" visible="#{bean.saidHello}">