2013-04-22 20 views
5

Tôi có sau <p:dialog>p: hộp thoại bị đóng trên lỗi xác thực của một lần gửi với ajax = "false", cách giữ hộp thoại mở?

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

Các bao gồm tập tin chứa các nút tải sau:

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

này sử dụng <p:fileDownload> để tải về các tập tin, điều này có nghĩa là tôi phải sử dụng ajax="false" cho <p:fileDownload> để kích hoạt.

Nhưng nếu có lỗi xác thực trong hộp thoại, thì tôi thấy cửa sổ hộp thoại bị đóng. Tôi muốn thông báo lỗi được hiển thị trong cửa sổ hộp thoại chứ không phải trong trang chính.

Làm cách nào để giữ hộp thoại mở, để tôi có thể hiển thị thông báo lỗi trong cửa sổ hộp thoại?


@Balusc Hãy tìm nỗ lực của tôi trên SSCCE Về cơ bản có một parent.xhtml nơi cư trú của nút tải về và có một downloadDialog.xhtml nhúng vào p: thoại

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

Bên 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> 

Khi tôi nhấn nút tải xuống trên cửa sổ hộp thoại, lỗi được hiển thị trên html và hộp thoại mẹ vẫn đóng. Nhưng khi tôi nhấn nút tải xuống trên trang mẹ, cửa sổ hộp thoại xuất hiện lại và chứa thông báo lỗi trong cửa sổ hộp thoại bên trong.

Cảm ơn bạn đã được trợ giúp.

Trả lời

1

Điều gì sẽ xảy ra nếu bạn ủy quyền một phần phương thức tải xuốngFile cho phương pháp khác?

Trong trường hợp này, bạn sẽ cần một phương pháp khác (hãy gọi nó là PrepareDownloadFile) sẽ được gọi bằng cách sử dụng ajax. Khi phương thức này hoàn tất, bạn có thể kiểm tra lỗi. Trong trường hợp mọi thứ diễn ra tốt đẹp, bạn có thể gọi remoteCommand (với ajax = false) để gửi tệp cho người dùng.

Một ý tưởng khác là sử dụng iframe. Hãy xem post này.

Hy vọng điều đó sẽ hữu ích!

Các vấn đề liên quan