2013-04-22 4 views
5

Ich habe folgendes <p:dialog>p: Dialog wird geschlossen bei Validierungsfehler einer Submit mit AJAX = "False", wie Dialog offen halten?

<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> 

Die Include-Datei die folgende Download-Button enthält:

<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> 

Dies verwendet <p:fileDownload> für die Datei heruntergeladen haben, bedeutet dies, ich ajax="false" für <p:fileDownload> verwenden müssen auszulösen.

Aber wenn es einen Fehler bei der Validierung im Dialogfeld gibt, dann sehe ich, dass das Dialogfenster geschlossen wird. Ich möchte, dass die Fehlermeldung im Dialogfenster und nicht auf der Hauptseite angezeigt wird.

Wie behalte ich den Dialog offen, damit ich die Fehlermeldung im Dialogfenster anzeigen kann? Bitte


@Balusc mein Versuch auf SSCCE finden Grundsätzlich gibt es eine parent.xhtml wo die Download-Button wohnt und es gibt eine downloadDialog.xhtml auf der p eingebettet: Dialog

<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> 

Innen 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> 

Wenn ich den Download-Button drücken auf das Dialogfenster, wird der Fehler auf der hTML-Mutter angezeigt und Dialog bleibt geschlossen. Aber wenn ich den Download-Knopf auf der Elternseite drücke, erscheint das Dialogfenster wieder und enthält die Fehlermeldung im inneren Dialogfenster.

Danke für jede Hilfe.

Antwort

1

Was ist, wenn Sie einen Teil der downloadFile Methode an eine andere Methode delegieren?

In diesem Fall benötigen Sie eine andere Methode (nennen wir es prepareDownloadFile), die mit Ajax aufgerufen werden würde. Sobald diese Methode abgeschlossen ist, können Sie nach Fehlern suchen. Falls alles gut läuft, können Sie einen remoteCommand (mit ajax = false) aufrufen, um die Datei an den Benutzer zu senden.

Eine andere Idee wäre, iframes zu verwenden. Überprüfen Sie diese post.

Hoffe, dass hilft!

Verwandte Themen