2013-04-22 9 views
5

Ho il seguente <p:dialog>p: la finestra di dialogo viene chiusa sull'errore di convalida di un invio con ajax = "false", come mantenere aperta la finestra di dialogo?

<p:dialog id="dlgDownload" header="#{appmsg['header.download.popup']}" widgetVar="downloadDlg" resizable="true" modal="true" closable="true" width="640" dynamic="false"> 
    <h:form id="frmDownload"> 
     <ui:include src="downloadDialog.xhtml" /> 
    </h:form> 
</p:dialog> 

Il includere file contiene il seguente pulsante di download:

<p:commandButton id="btnDlgDownload" value="#{appmsg['action.download.label']}" title="#{appmsg['action.download.label']}" 
    icon="ui-icon-arrowthickstop-1-s" ajax="false" oncomplete="if (!args.validationFailed){downloadDlg.hide();} else {downloadDlg.show();}" process="@this" update=":#{p:component('pnlDownload')}" > 
    <p:fileDownload value="#{downloadController.downloadFile()}" /> 
</p:commandButton> 

Questo utilizza <p:fileDownload> per il download, questo significa che devo usare ajax="false" per <p:fileDownload> per innescare.

Ma se c'è un errore di convalida nella finestra di dialogo, allora vedo che la finestra di dialogo viene chiusa. Voglio che il messaggio di errore venga mostrato nella finestra di dialogo e non nella pagina principale.

Come mantenere la finestra di dialogo aperta, in modo che sia possibile visualizzare il messaggio di errore nella finestra di dialogo?


@Balusc Si prega di trovare il mio tentativo su SSCCE Fondamentalmente c'è un parent.xhtml dove risiede sul pulsante Download e v'è una downloadDialog.xhtml incorporato sul p: dialogo

<p:messages id="globalMessages" globalOnly="true" showDetail="true" 
     showSummary="true" closable="true" /> 
    <h:form = "parentForm" > 
        <p:commandButton id="btnDownload" 
         value="Download" 
         title="Download" 
       icon="ui-icon-arrowthickstop-1-s" onclick="downloadDlg.show();"> 
      </p:commandButton> 
</h:form> 
    <p:dialog id="dlgDownload" header="Download" widgetVar="downloadDlg" resizable="true" 
     modal="true" closable="true" width="640" dynamic="false" visible="#{frmDownload.submitted and facesContext.validationFailed}"> 
     <h:form id="frmDownload" binding="#{frmDownload}"> 
     <ui:include src="downloadDialog.xhtml" /> 
     </h:form> 
    </p:dialog> 

All'interno downloadDialog .xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:c="http://java.sun.com/jsp/jstl/core" 
     xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui" 
     xmlns:pe="http://primefaces.org/ui/extensions"> 

     <p:outputPanel id="pnlDownload"> 
    <h:panelGrid id="dateDisplayGrid" columns="4" style="margin-bottom:10px" cellpadding="5" rendered="#{downloadForm.displayDates}"> 
    <p:calendar id="strtdt" readonlyInput="true" size="12" value="#{downloadForm.startDate}" > 
       </p:calendar> 
       <h:outputText value="#{appmsg['label.to']}" />    
    <p:calendar id="enddt" readonlyInput="true" size="12" value="#{downloadForm.endDate}" 
       pattern="#{dateFormatting.shortDateFormat}" navigator="true" > 
       <f:validator validatorId="dateRangeValidator" /> 
       <f:attribute name="startDate" value=":#{p:component('strtdt')}" />   
       </p:calendar> 
       <p:message id="dateError" for="enddt" showDetail="true" showSummary="false"></p:message>   
      </h:panelGrid> 
    <p:commandButton id="btnDlgDownload" value="Download" title="Download" 
        icon="ui-icon-arrowthickstop-1-s" ajax="false" oncomplete="if(!args.validationFailed)downloadDlg.hide();" > 
    <p:fileDownload value="#{downloadController.downloadFile()}" /> 
       </p:commandButton> 

       <p:button id="btnDlgCancel" value="#{webmsg['action.cancel']}" onclick="downloadDlg.hide(); return false" href="#" /> 
     </p:panel> 
    </p:outputPanel> 
</ui:composition> 

Quando mi ha colpito il pulsante di download nella finestra di dialogo, l'errore ottiene visualizzata sul html genitore e dialogo rimane chiuso. Ma quando premo il pulsante di download sulla pagina madre, la finestra di dialogo riappare e contiene il messaggio di errore nella finestra di dialogo interna.

Grazie per qualsiasi aiuto.

risposta

1

Cosa succede se si delegano parte del metodo downloadFile a un altro metodo?

In questo caso, sarebbe necessario un altro metodo (chiamiamolo prepareDownloadFile) che verrebbe chiamato utilizzando ajax. Una volta che questo metodo è completo, puoi controllare gli errori. Nel caso in cui tutto funzioni correttamente, è possibile chiamare un comando remoto (con ajax = false) per inviare il file all'utente.

Un'altra idea sarebbe utilizzare iframe. Dai un'occhiata a questo post.

Spero che questo aiuti!