【发布时间】: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 就好了。
问题:
到目前为止,当界面初始化为工作区时,我使用打开和关闭对话框一次。有谁知道首先是什么导致了这个问题以及如何正确解决它?
感谢解答
【问题讨论】:
-
您是否尝试更改
<h:form>的位置?!?我 100% 确定这是问题所在。 -
您的表格中有表格吗?我看到你更新 mainForm:messageDialogHeader
-
当前 HTML 规范中不允许嵌套表单
-
@YagamiLight 我尝试完全删除表单,但它仍然具有完全相同的行为。 “mainForm”表单是当前打开对话框的站点表单
-
尝试更新整个对话框 RequestContext context = RequestContext.getCurrentInstance(); context.update(":dlgMessageDialog");
标签: jsf primefaces jsf-2