AJAX表单提交期间的验证失败打破了AJAX

时间:2013-03-12 13:43:37

标签: java ajax jsf-2 primefaces dialog

好的,所以我已经阅读了stackoverflow和网络的其他各个部分几天,还没有找到解决我问题的解决方案。

基本上,我在h:form中有一个p:dialog,其中包含两个必填字段。填写字段后,表单将成功提交并关闭对话框。当其中一个或两个字段留空时,必填字段验证将失败,并使用相应的必需消息更新h:messages中的p:dialog组件。但是,当验证失败时,AJAX调用似乎永远不会“完成”并阻止后续调用被执行。我的p:ajaxStatus组件永远不会从屏幕上消失,这表明某些挂起某处。这可以通过刷新页面来解决,此时所有其他AJAX组件再次开始运行。

此外,我会注意到此p:dialog位于ui:define中的ui:composition,将其转储到主模板中。 嵌套在另一个h:form中。

<p:dialog id="dlgDecision"
                  header="Decision"
                  widgetVar="dialogDecision"
                  modal="false"
                  resizable="false"
                  appendToBody="true">
            <h:form id="fDlgDecision">
                <h:messages id="msgDlgDecision" binding="#{msgform.messages}" errorClass="errormsg" infoClass="infomsg1" layout="table"/>
                <h:outputFormat rendered="#{studentdetailsform.decisionAction == 'A'}">
                    <h:outputText value="Select an accept and admit code."/>
                </h:outputFormat>
                <h:outputFormat rendered="#{studentdetailsform.decisionAction == 'C'}">
                    <h:outputText value="Select a cancel and reason code."/>
                </h:outputFormat>
                <h:panelGrid columns="1">
                    <h:selectOneMenu id="apdcCode"
                                     value="#{studentDetails.apdcCode}"
                                     required="true"
                                     requiredMessage="Please choose a decision code.">
                        <f:selectItem itemLabel="Select Decision Code"/>
                        <f:selectItems value="#{apdcCodes.apdcCodeList}"
                                       var="apdc"
                                       itemValue="#{apdc.apdcCode}"
                                       itemLabel="#{apdc.apdcCode} - #{apdc.apdcDesc}"/>
                    </h:selectOneMenu>
                    <h:selectOneMenu id="admtCode"
                                     value="#{studentDetails.admtCode}"
                                     required="#{studentdetailsform.decisionAction == 'A'}"
                                     requiredMessage="Please choose an admit code."
                                     rendered="#{studentdetailsform.decisionAction == 'A'}">
                        <f:selectItem itemLabel="Select Admit Code"/>
                        <f:selectItems value="#{admtCodes.admtCodeList}"
                                       var="admt"
                                       itemValue="#{admt.admtCode}}"
                                       itemLabel="#{admt.admtCode} - #{admt.admtDesc}"/>
                    </h:selectOneMenu>
                    <h:selectOneMenu id="wrsnCode"
                                     value="#{studentDetails.wrsnCode}"
                                     required="#{studentdetailsform.decisionAction == 'C'}"
                                     requiredMessage="Please choose a reason code."
                                     rendered="#{studentdetailsform.decisionAction == 'C'}">
                        <f:selectItem itemLabel="Select Reason Code"/>
                        <f:selectItems value="#{wrsnCodes.wrsnCodeList}"
                                       var="wrsn"
                                       itemValue="#{wrsn.wrsnCode}"
                                       itemLabel="#{wrsn.wrsnCode} - #{wrsn.wrsnDesc}"/>
                    </h:selectOneMenu>
                    <p:commandButton id="decisionSubmit"
                                     value="Submit Decision"
                                     type="submit"
                                     action="#{mainform.saveDecision}"
                                     ajax="true"
                                     partialSubmit="true"
                                     process="@form"
                                     update="@form msgDlgDecision"
                                     oncomplete="if (!args.validationFailed) dialogDecision.hide()"/>
                </h:panelGrid>
            </h:form>
        </p:dialog>

我在调试和故障排除方面已经完成的一些事情:
- 将h:form移至p:dialog
- 使必填字段rendered上的ViewScoped属性的值具有支持bean(仅显示一些所需消息的问题,这解决了这个问题)
- 将appendToBody="true"添加到p:dialog
- 在if (!args.validationFailed)的{​​{1}}事件中添加了oncomplete - 尝试使所需字段不是有条件的(删除p:dialog属性)以确保这不是由非渲染组件上的验证失败引起的(抓住吸管......)

编辑:以下是Chrome的控制台转储。提交包含null必填字段的表单时会抛出Javascript错误。

rendered

编辑2:以下是仅有的两个JavaScript导入,这两个导入都在我的模板中,该模板通过上面提到的Uncaught SyntaxError: Unexpected token { jquery.js:14 bG.extend.parseJSON jquery.js:14 PrimeFaces.ajax.AjaxUtils.handleResponse primefaces.js:1 PrimeFaces.ajax.AjaxResponse primefaces.js:1 j.success primefaces.js:1 bZ jquery.js:14 b7.fireWith jquery.js:14 ca jquery.js:21 bZ ui:define应用于页面。

ui:composition

第一次导入将强制Primefaces将jQuery导入页面,即使页面上没有使用JavaScript的组件也是如此。这是为了允许<h:outputScript library="primefaces" name="jquery/jquery.js" /> <script type="text/javascript" src="#{request.contextPath}/resources/scripts/jscript.js" /> 中的自定义脚本可靠地使用jQuery。

其他信息:
JSF 2.1
Primefaces 3.4.2
Tomcat 6.0

3 个答案:

答案 0 :(得分:0)

不要手动导入jQuery.js,因为这已经由PrimeFaces隐式完成(它使用了jQuery)。你可以删除该行。

此外,您应该看到一些导入自定义js文件的示例,例如h:outputScript,例如:

<h:outputScript library="scripts" name="jscript.js" />

但这可能不是你问题的原因,这只是提示更好的JSF设计。

答案 1 :(得分:0)

今天,在我下载了PrimeFaces 4.0快照(2013-05-09)并测试了我的应用后,Google Chrome中出现了类似的错误。

基本上,我必须通过JSON从bean发送到p:schedule的数据中删除单引号。由于错误提到了“解析JSON”和“意外”(意外的单引号),我转到数据的数据表视图(而不是p:schedule),并认识到某些数据嵌入了单引号。所以,我从数据中删除了单引号,这解决了我的问题。

请点击下面的论坛主题网址。

PF 4.0 SNAPSHOT 2013-05-09: schedule not working

答案 2 :(得分:0)

我的应用程序遇到了完全相同的问题。真正的问题是重复的jar问题。

我的应用程序中有两个primefaces jar,一个位于WEB-INF / lib目录下,另一个位于ear / lib目录下。一旦我删除了WEB-INF下的那个,一切都开始按预期工作了。

您可以通过搜索js例外在网上找到解决方案。