Automatically show validation messages in p:dialog on validation failure

前端 未结 1 1026
感动是毒
感动是毒 2020-12-11 05:09

I want to present validation messages and messages from backing bean in component. In my JSF page I have following dialog defined:



        
相关标签:
1条回答
  • 2020-12-11 05:48

    You can use the visible attribute of <p:dialog> to specify whether the dialog should show up by default or not. You can check by FacesContext#isValidationFailed() if there's a validation failure or not.

    So, in a nutshell:

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

    (note that I simplified the unnecessary h:form and p:commandButton by a p:button)

    Which is then to be updated by:

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

    Or by just placing it inside a <p:outputPanel autoUpdate="true"> so that it auto-updates itself on every ajax request without the need to specify it in every update attribute:

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

    See also:

    • Difference between rendered and visible attributes of <p:dialog>

    Unrelated to the concrete problem, to cover non-validation messages, such as those global messages which you add in the action method, rather check instead if FacesContext#getMessageList() is not empty.

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

    This will then show the dialog when there is any message. This way that RequestContext#execute() call is unnecessary.

    0 讨论(0)
提交回复
热议问题