5

私は次のものを持っています<p:dialog>

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

インクルード ファイルには、次のダウンロード ボタンが含まれています。

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

これは<p:fileDownload>ファイルのダウンロードに使用されます。つまり、トリガーするにはajax="false"forを使用する必要があります。<p:fileDownload>

しかし、ダイアログで検証エラーが発生すると、ダイアログ ウィンドウが閉じられます。メイン ページではなく、ダイアログ ウィンドウにエラー メッセージを表示したい。

ダイアログを開いたままにして、ダイアログ ウィンドウにエラー メッセージを表示するにはどうすればよいですか?


@Balusc SSCCEでの私の試みを見つけてください基本的に、ダウンロードボタンが存在するparent.xhtmlがあり、p:dialogに埋め込まれたdownloadDialog.xhtmlがあります

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

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>

ダイアログ ウィンドウでダウンロード ボタンをクリックすると、エラーが親 html に表示され、ダイアログが閉じたままになります。しかし、親ページのダウンロード ボタンを押すと、ダイアログ ウィンドウが再表示され、ダイアログ ウィンドウ内にエラー メッセージが表示されます。

助けてくれてありがとう。

4

1 に答える 1

1

downloadFileメソッドの一部を別のメソッドに委譲するとどうなるでしょうか。

この場合、ajax を使用して呼び出される別のメソッド ( prepareDownloadFileと呼びましょう) が必要になります。このメソッドが完了したら、エラーをチェックできます。すべてがうまくいった場合は、(ajax=false を指定して) remoteCommand を呼び出して、ファイルをユーザーに送信できます。

別のアイデアは、iframe を使用することです。この投稿をチェックしてください。

それが役立つことを願っています!

于 2013-07-14T15:56:26.133 に答える