【问题标题】:How to show messages in p:dialog?如何在 p:dialog 中显示消息?
【发布时间】:2015-11-05 07:32:05
【问题描述】:

在对话框中显示错误消息时,我需要您的帮助。通过单击命令按钮,对话框中不会显示任何消息。

即使我尝试在对话框中显示消息,但没有任何错误显示。

那么我怎样才能在对话框中而不是在主窗体中生成消息

这是JSF页面代码:

<h:form id="Requests">
    <p:messages id="messages" showDetail="true" autoUpdate="true" closable="true"/>

    <p:dialog id="c1" header="C1" widgetVar="c1">
        <p:message id="messagePDFSTAR"
                   for=":Requests:DownloadPDFSTAR"
                   showDetail="true" />
        <p:commandButton id="DownloadPDFSTAR"
                         value="Download"
                         ajax="false"
                         actionListener="#{hrd.PDFSTAR}"
                         update=":Requests:messagePDFSTAR" >

            <p:fileDownload value="#{hrd.fileSTAR}" />
        </p:commandButton>
    </p:dialog>
</h:form>

这里是java bean代码:

public void PDFSTAR() {

    try {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Ref is Null", "Ref is Null");
        RequestContext.getCurrentInstance().showMessageInDialog(message);
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, "Fatal!", "System Error"));
    } catch (Exception e) {
        e.printStackTrace();
    }
}

【问题讨论】:

  • 你想要对话框外的按钮吗?你Xhtml有点乱!
  • @BalusC 请立即查看
  • @KishorP 按钮在对话框内

标签: jsf jsf-2 primefaces dialog messages


【解决方案1】:

这是因为你在命令按钮上有ajax=false,所以属性update::Requests:messagePDFSTAR 不起作用。 您不能将ajax=falseupdate="..." 组合在一起,更新属性仅适用于ajax 操作。

我知道您需要 ajax=false,因为 p:fileDownload 可以使用它,但也许您可以尝试其他方式来显示您想要的消息。

我曾经处理过这种情况并使用了一种解决方法,在p:dialog 中,您可以使用p:messagesautoUpdate=true

<h:form id="Requests">
    <p:messages id="messages" showDetail="true" autoUpdate="true" closable="true"/>

    <p:dialog id="c1" header="C1" widgetVar="c1">
        <p:messages id="messagesPDFSTAR"
                    autoUpdate="true"
                   showDetail="true" />
        <p:commandButton id="DownloadPDFSTAR"
                         value="Download"
                         ajax="false"
                         actionListener="#{hrd.PDFSTAR}" >

            <p:fileDownload value="#{hrd.fileSTAR}" />
        </p:commandButton>
    </p:dialog>
</h:form>

希望对你有所帮助。

编辑:

RequestContext.getCurrentInstance().showMessageInDialog(message);

它在新对话框中显示消息,但我认为这不是您想要的。您想在commandButtonfileDownLoad 的同一对话框中显示消息。

Ajax and update not working correctly

【讨论】:

  • 我会试试这个,我会回来的
  • 我觉得这应该行不通,按钮不是ajax,autoUpdate="true"的意思是每次ajax请求都更新组件,所以我猜应该行不通。
【解决方案2】:

要在下载后将组件更新为 p:growl 或 p:messages,甚至在开始时只需使用 p:remoteCommand 和 PrimeFaces.monitorDownload(start, stop);,如此处提供的示例 Primefaces File Download example

我会这样做:

<script type="text/javascript">
    function start() {
        PF('statusDialog').show();
        //maybe some other blah blah..
        updateMyMessages();
    }

    function stop() {
        PF('statusDialog').hide();
        //maybe some other blah blah..
        updateMyMessages();
    }
</script>

<div class="card">
    <p:dialog modal="true" widgetVar="statusDialog" header="Status" draggable="false" closable="false"
              resizable="false">
              <i class="pi pi-spinner pi-spin" style="font-size:3rem"></i>
    </p:dialog>

    <h:form>
        <p:messages id="messagesPDFSTAR"/>
        <p:remoteCommand name="updateMyMessages" update="messagesPDFSTAR" action="#{hrd.PDFSTAR}"/>
        <p:commandButton value="Download" ajax="false" onclick="PrimeFaces.monitorDownload(start, stop);"
                         icon="pi pi-arrow-down" styleClass="p-mr-2">
            <p:fileDownload value="#{fileDownloadView.file}"/>
        </p:commandButton>
</div>

请注意,我调用了远程命令两次,因此您可以对消息进行两次更新,这还将执行您的操作#{hrd.PDFSTAR} 两次,一次在下载开始时,另一次在下载完成时,因此请根据需要进行修改。

您可以随时升级到 Primefaces 10.0.0 并在下载按钮上使用 ajax

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 2013-02-26
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多