2013-04-22 18 views
5

Mam następujący <p:dialog>p: dialog zostaje zamknięty przy błędzie sprawdzania poprawności zgłoszenia z ajax = "false", jak zachować otwarte okno dialogowe?

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

include plik zawiera następujący przycisk pobierania:

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

używa <p:fileDownload> za pobranie pliku, oznacza to muszę używać ajax="false" dla <p:fileDownload> wyzwolić.

Ale jeśli w oknie dialogowym pojawi się błąd sprawdzania poprawności, widzę, że okno dialogowe zostanie zamknięte. Chcę, aby komunikat o błędzie był wyświetlany w oknie dialogowym, a nie na stronie głównej.

Jak zachować otwarte okno dialogowe, aby móc wyświetlić komunikat o błędzie w oknie dialogowym?


@Balusc Proszę znaleźć zamachu na SSCCE Zasadniczo jest parent.xhtml którym znajduje się przycisk Pobierz, a tam jest downloadDialog.xhtml osadzone na str: 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> 

Wewnątrz 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> 

Po naciśnięciu przycisku pobierania w oknie dialogowym, błąd zostanie wyświetlony na macierzystym html, a okno dialogowe pozostanie zamknięte. Ale po naciśnięciu przycisku pobierania na stronie nadrzędnej ponownie pojawia się okno dialogowe zawierające komunikat o błędzie w wewnętrznym oknie dialogowym.

Dzięki za pomoc.

Odpowiedz

1

Co się stanie, jeśli przeniesiesz część metody downloadFile na inną metodę?

W tym przypadku potrzebowalibyśmy innej metody (nazwijmy ją: prepareDownloadFile), która byłaby wywoływana za pomocą ajax. Po zakończeniu tej metody możesz sprawdzić błędy. Jeśli wszystko pójdzie dobrze, możesz zadzwonić do remoteCommand (z ajax = false), aby wysłać plik do użytkownika.

Innym pomysłem byłoby użycie elementów iframe. Sprawdź to post.

Nadzieję, że pomaga!