RichFaces中如何让ModalPanel在Ajax验证有错误时不关闭

ModalPanel在有Ajax刷新请求的时候,一般会关闭,比如验证错误的时候
我自己的解决办法是让ModalPanel的现实与否不与JS有关,完全用conversation中的某个变量想关联,这样当一个ModalPanel显示以后,无论什么Ajax刷新请求都不回让ModalPanel关掉,除非我让他关掉

网上还有两种解决方案,现列举如下。

第一种方法:
<ui:define name="body">
     <f:verbatim>
          <a href="javascript:Richfaces.showModalPanel('_panel',{left:'auto', top:'auto'})">
               Show Modal Panel
          </a>
     </f:verbatim>
     <rich:modalPanel id="_panel">
          <f:facet name="header">
               <h:outputText value="test"></h:outputText>
          </f:facet>
          <h:form id="mpform">
               <a4j:outputPanel ajaxRendered="true">
                    <h:messages id="error"></h:messages>
               </a4j:outputPanel>
               <h:inputText value="#{bean.property}" required="true"></h:inputText>
               <a4j:commandLink value="click" oncomplete="windowclose();"
                    reRender="test" ></a4j:commandLink>
          </h:form>
     </rich:modalPanel>
     <script type="text/javascript">
          //<![CDATA[
               function windowclose(){
                    if (document.getElementById('mpform:error')==null){
                         Richfaces.hideModalPanel('_panel');
                    };
               };
//\]\]\>

     </script>
</ui:define>
这种方法的思想是,在关闭ModalPanel的时候判断是否有message在里面,如果没有,就关掉,如果ModalPanel里面有message,就让它继续显示着。

第二种方法:

这种方法的前提是,使用Facelets

在模板里面增加这段代码:
<a4j:outputPanel ajaxRendered="true">
   <h:form style="display:none" prependId="false">
        <h:inputHidden id="maximumSeverity" value="#{facesContext.maximumSeverity.ordinal}"/>
    </h:form>             
</a4j:outputPanel>

然后在你需要加ModalPanel的页面增加以下这段JS代码:
function ajaxRequestContainsErrors() {
    return document.getElementById("maximumSeverity").value == "2";
}
作用是检查是否包含错误消息
最后在具体的连接或者按钮上增加相应的处理事件:
<a4j:commandButton value="Save" action="#{myController.save}"
     oncomplete="if (!ajaxRequestContainsErrors()) Richfaces.hideModalPanel('myModalPanelId');"/>

你可能感兴趣的:(Ajax,Richfaces)