[英]validation and rich: popupPanel don't work
我的意圖是在BD中插入記錄后,以豐富的消息:popupPanel向用戶顯示一條消息。
使用下面的代碼,我可以做我想做的事,但是有一個問題。 僅在我正確鍵入所有頁面字段時有效。 如果其中一個字段未通過驗證,則驗證消息將顯示在h:messages中,並且即使我更改了該字段的內容並再次單擊該按鈕,頁面也不會更改。
有什么事嗎
頁
<h:outputLabel value="Nome:" for="nome1" /> <h:inputText id="nome1" maxlength="50" required="true" requiredMessage="Informe um nome" immediate="true"/> <h:outputLabel value="Logradouro:" for="logradouro" /> <h:inputText id="logradouro" maxlength="50" required="true" requiredMessage="Informe o logradouro" immediate="true"/> <h:outputLabel value="Bairro:" for="bairro" /> <h:inputText id="bairro" maxlength="45" required="true" requiredMessage="Informe o bairro" immediate="true" /> <h:outputLabel value="CEP:" for="cep" /> <h:inputText id="cep" maxlength="8" required="true" requiredMessage="Informe o CEP" immediate="true"> <f:convertNumber integerOnly="true" groupingUsed="false" maxIntegerDigits="8" /> </h:inputText> <a4j:commandButton id="btnInserirDizimista" value="Inserir" oncomplete="#{rich:component('pnlOk')}.show()" render="pnlMessages outPnlOk" actionListener="#{dizimistaMB.inserirDizimista}"/> <a4j:outputPanel id="outPnlOk" ajaxRendered="true"> <rich:popupPanel id="pnlOk" modal="true" height="150"> <h:graphicImage value="/images/info.jpg" /> <h:outputText id="textoModalOk" value="#{dizimistaMB.textoModal}" /> <h:commandButton value="OK" action="dizimista?faces-redirect=true" onclick="#{rich:component('pnlOk')}.hide(); return false;" > <a4j:ajax execute="formPnlOk" /> </h:commandButton> </rich:popupPanel> </a4j:outputPanel>
托管豆
public void inserirDizimista(){ try{ defineDizimista("formNovoDizimista"); dizimistaFacade.criar(dizimista); setTextoModal("Dizimista inserido com sucesso"); System.out.println("Dizimista '" + dizimista.getNome1() + "' inserido com sucesso"); dizimista = null; } catch (DAOException e) { FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), null); JSFHelper.getFacesContext().addMessage("ATENÇÃO!", msg); e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } private void defineDizimista(String nomeForm){ Map<String, String> dados = getDadosFormulario(nomeForm); dizimista.setNome1(dados.get("nome1")); dizimista.setLogradouro(dados.get("logradouro")); dizimista.setBairro(dados.get("bairro")); dizimista.setCep(Integer.parseInt(dados.get("cep"))); } private Map<String, String> getDadosFormulario(String form){ Map<String, String> dados = new HashMap<String, String>(); dados.put("nome1", JSFHelper.getRequestParameter(form + UINamingContainer.getSeparatorChar(JSFHelper.getFacesContext()) + "nome1")); dados.put("logradouro", JSFHelper.getRequestParameter(form + UINamingContainer.getSeparatorChar(JSFHelper.getFacesContext()) + "logradouro")); dados.put("bairro", JSFHelper.getRequestParameter(form + UINamingContainer.getSeparatorChar(JSFHelper.getFacesContext()) + "bairro")); dados.put("cep", JSFHelper.getRequestParameter(form + UINamingContainer.getSeparatorChar(JSFHelper.getFacesContext()) + "cep")); dados.put("cidade", JSFHelper.getRequestParameter(form + UINamingContainer.getSeparatorChar(JSFHelper.getFacesContext()) + "cidade")); return dados; }
通過AJAX渲染rich:popupPanel
的內容(從a4j:commandButton
渲染)時,最好選擇使用其show
屬性有條件地顯示它,而不是調用Javascript代碼(不完整)。
因此,我建議您僅添加一個顯示popupPanel
的條件。 假設初始化時textoModal
為null,並且bean是一個范圍限定的請求,則可以使用如下所示的內容:
<rich:popupPanel id="pnlOk" modal="true"
show="#{dizimistaMB.textoModal != null}" ...>
您可能想要在后備bean中創建一個類似於public boolean isShowTextoModal()
的方法,該方法可以實現比僅檢查字段是否為null更好的規則。
然后,您可以將按鈕更改為此:
<h:commandButton id="btnInserirDizimista" value="Inserir"
render="pnlMessages outPnlOk"
action="#{dizimistaMB.inserirDizimista}" />
...並從方法inserirDizimista
刪除ActionEvent
參數,使其成為一個操作方法,而不是actionListener 。
這應該可以幫助您。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.