【问题标题】:Primefaces p:messages won't show first FacesMessagePrimefaces p:消息不会显示第一个 FacesMessage
【发布时间】:2017-02-15 03:54:57
【问题描述】:

先决条件
- JSF 2.1
- Primefaces 5.2
- 玻璃鱼 3.1

故事
我创建了一个 p:dialog 用于在 p:messages 元素上显示 FacesMessages。此对话框是必需的,因为用户必须在继续之前使用“确定”按钮提交特定的 FacesMessage。

对话框

<p:outputPanel id="modalMessage">

    <p:dialog id="dlgMessageDialog" dynamic="true" style="z-index: 100"
        closable="false" widgetVar="wigVarMessageDialog" modal="true"
        appendTo="@(body)">

        <f:facet name="header">
            <h:outputText id="messageDialogHeader"
                value="#{messageDialogBean.header}" />
        </f:facet>

        <p:outputPanel id="modalMessagePanel">

            <h:form id="messageForm" enctype="multipart/form-data">

                <p:messages id="messages" escape="false" closable="false"
                    showDetail="true" autoUpdate="true"
                    for="#{messageDialogBean.messageDialogId}"></p:messages>

                <p:spacer height="20px"></p:spacer>

                <p:commandButton value="#{msg.btnOk}"
                    oncomplete="PF('wigVarMessageDialog').hide()" />

            </h:form>
        </p:outputPanel>
    </p:dialog>
</p:outputPanel>

豆子

@Named("messageDialogBean")
@SessionScoped
public class MessageDialogBean implements Serializable {

  private static final long serialVersionUID = 1L;
  private final String messageDialogId = "messageDialogId";
  private FacesMessage message = new FacesMessage();
  private String header = "test";

  public void showMessage(final String pHeader, final FacesMessage pMessage) {
    if (pMessage != null) {
        setHeader(pHeader);
        this.message = pMessage;
        show();
    }
  }

  public void showWarn(final String pHeader, final String pSummary, final String pDetail) {
    setHeader(pHeader);
    this.message = new FacesMessage(FacesMessage.SEVERITY_WARN, pSummary, pDetail);
    show();
  }

  public void showInfo(final String pHeader, final String pSummary, final String pDetail) {
    setHeader(pHeader);
    this.message = new FacesMessage(FacesMessage.SEVERITY_INFO, pSummary, pDetail);
    show();
  }

  public void showError(final String pHeader, final String pSummary, final String pDetail) {
    setHeader(pHeader);
    this.message = new FacesMessage(FacesMessage.SEVERITY_ERROR, pSummary, pDetail);
    show();
  }

  public void updateDialog() {
    RequestContext context = RequestContext.getCurrentInstance();
    context.update("mainForm:messageDialogHeader");
  }

  private void show() {
    updateDialog();
    RequestContext context = RequestContext.getCurrentInstance();
    context.execute("PF('wigVarMessageDialog').show();");
    FacesContext.getCurrentInstance().addMessage(this.messageDialogId, this.message);
  }

  public String getMessageDialogId() {
    return this.messageDialogId;
  }

  public void setHeader(final String pHeader) {
    this.header = pHeader;
  }

  public String getHeader() {
    return this.header;
  }

  public FacesMessage getLastMessage() {
    return this.message;
  }

}

必须提交的消息之一

this.messageDialogBean.showInfo("Title", "Summary", "Detail");

问题
第一次打开对话框时,对话框的 p:messages 元素不显示消息。打开并隐藏它后,它会显示所有其他 FacesMessages 就好了。

问题
到目前为止,当界面初始化为工作区时,我使用打开和关闭对话框一次。有谁知道首先是什么导致了这个问题以及如何正确解决它?

感谢解答

【问题讨论】:

  • 您是否尝试更改&lt;h:form&gt; 的位置?!?我 100% 确定这是问题所在。
  • 您的表格中有表格吗?我看到你更新 mainForm:messageDialogHeader
  • 当前 HTML 规范中不允许嵌套表单
  • @YagamiLight 我尝试完全删除表单,但它仍然具有完全相同的行为。 “mainForm”表单是当前打开对话框的站点表单
  • 尝试更新整个对话框 RequestContext context = RequestContext.getCurrentInstance(); context.update(":dlgMessageDialog");

标签: jsf primefaces jsf-2


【解决方案1】:

首先,不允许将一个表单放入另一个表单中,正如 W3C XHTML 规范中所述,“表单不得包含其他表单元素”。访问:https://www.w3.org/TR/xhtml1/#prohibitions

所以你的对话框不应该在主窗体内,你必须将对话框从窗体中分离出来,你的代码应该是这样的:

<form id="mainForm" >
    <!--your main page-->
</form>

<p:dialog id="dlgMessageDialog" >
    <h:form id="messageForm" enctype="multipart/form-data">
        <f:facet name="header">
            <h:outputText id="messageDialogHeader"
                          value="#{messageDialogBean.header}" />
        </f:facet>

        <p:messages id="messages" escape="false" closable="false"
                    showDetail="true" autoUpdate="true"
                    for="#{messageDialogBean.messageDialogId}"></p:messages>

        <p:spacer height="20px"></p:spacer>

        <p:commandButton value="#{msg.btnOk}"
                         oncomplete="PF('wigVarMessageDialog').hide()" />

    </h:form>
</p:dialog>

另一件事,你必须更新整个对话框,所以当对话框打开时,消息会自动更新:

context.update("dlgMessageDialog");

【讨论】:

  • 已经尝试删除表单并更新整个对话框。它没有改变任何东西。
  • 尝试做 FacesContext.getCurrentInstance().addMessage(this.messageDialogId, this.message);然后 updateDialog();
  • 关于“messageDialogId”它出现在 html 中的什么位置?
  • messageDialogId 目前在我的 xhtml 中不存在,因为我没有使用它。它只是在那里供将来使用。一旦我让对话框开始工作,我会将所有其他人设置为 globalOnly,这样他们就不会显示我将在对话框中显示的少数特定消息。然后ofc。对话框的“for”标志将引用 messageDialogId。由于它现在没有引用任何内容,因此无论如何它都会显示消息,因为它不仅是全局的。
  • 也仍然没有向我解释为什么所有消息都工作正常,除了第一个。
猜你喜欢
  • 2013-12-27
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多