7

我想在组件中显示验证消息和来自支持 bean 的消息<p:dialog>。在我的 JSF 页面中,我定义了以下对话框:

<p:dialog widgetVar="messageDialog" id="msgDialog" modal="true" appendToBody="true">
    <h:form id="messageForm">
        <p:messages id="messagesInDialog" />
        <p:commandButton value="OK" onclick="messageDialog.hide()" />
    </h:form>
</p:dialog>

在支持 bean 中附加一些消息后,我执行以下代码:

RequestContext.getCurrentInstance().execute("messageDialog.show()");

它工作正常。

但是,我还想在此对话框中显示 bean 验证消息。验证后将消息附加到<p:message>组件,但我不知道如何在验证失败后显示此对话框。

我怎样才能做到这一点?

4

1 回答 1

14

您可以使用 的visible属性<p:dialog>来指定对话框是否应默认显示。您可以检查FacesContext#isValidationFailed()是否存在验证失败。

所以,简而言之:

<p:dialog id="msgDialog" widgetVar="messageDialog" modal="true" appendToBody="true"
    visible="#{facesContext.validationFailed}">
    <p:messages id="messagesInDialog" />
    <p:button value="OK" onclick="messageDialog.hide()" />
</p:dialog>

(请注意,我通过 a简化了不必要的h:form和)p:commandButtonp:button

然后将通过以下方式更新:

<p:commandButton value="submit" update=":msgDialog" />

或者只是将它放在 a<p:outputPanel autoUpdate="true">中,以便它在每个 ajax 请求上自动更新,而无需在每个update属性中指定它:

<p:outputPanel autoUpdate="true">
    <p:dialog id="msgDialog" widgetVar="messageDialog" modal="true" appendToBody="true"
        visible="#{facesContext.validationFailed}">
        <p:messages id="messagesInDialog" />
        <p:button value="OK" onclick="messageDialog.hide()" />
    </p:dialog>
</p:outputPanel>

也可以看看:


与具体问题无关,涵盖非验证消息,例如您在操作方法中添加的那些全局消息,而不是检查是否FacesContext#getMessageList()不为空。

<p:dialog ... visible="#{not empty facesContext.messageList}">

当有任何消息时,这将显示对话框。这样RequestContext#execute()调用就没有必要了。

于 2012-09-17T13:53:17.203 回答