2011-04-11 94 views
1

我使用Richfaces。我面臨的情況是我有一個表格和2個按鈕。點擊其中一個按鈕,說button1,我需要驗證。點擊另一個,button2,我不。當我點擊button1並且得到所有驗證錯誤信息時,就會出現這個問題。這可以防止點擊button2。我嘗試了ajaxSingle,immediate,這有助於繞過驗證,但bean值不會更新。我怎樣才能做到這一點?任何繞過驗證並仍然更新bean值的方法?

代碼:

<h:inputSecret value="#{bean.value} redisplay="true"/> 
<a4j:commandButton immediate="true" actionListener="#{bean.actionListener} reRender="ID_OF_PANEL_SURROUNDING_THIS_CODE"/> 

豆:W

public class bean { 
. 
. 
. 
public void actionListener(ActionEvent e) { 
value = "New value"; 
} 
. 
. 
. 
} 

回答

1

在你的第二個按鈕設置立即屬性真正

立即屬性跳過你的價值觀的驗證,但使用立即超過一瑣碎的情況下,任何其他取消按鈕是有問題的。如果您的按鈕2是某種取消按鈕,則沒有問題。

如果您需要實施比取消按鈕更復雜的操作,那麼您可以在下面的文章中找到這些問題的一些解決方案。

How_The_Immediate_Attribute_Works

+0

感謝您的信息和鏈接。但是,如果我使用immediate = true,則會傳遞驗證,但不會反映由Bean代碼更改的數據。這是問題。 – Prabhat 2011-04-11 12:50:04

+0

我認爲文章的解決方案1部分就是您正在尋找的內容。使用immediate和valueChangeListener。順便說一句,如果你用一點你的代碼更新你的問題。我可以幫助更多。 – 2011-04-11 13:32:11

+0

我已經更新了這個問題。這裏提到的按鈕是button2。 – Prabhat 2011-04-12 01:36:38

1

什麼是真正可能的情況下,這樣做是編寫自定義驗證,並做相關的檢查它。

conditionalValidation.xhtml:

請注意agregate要調用的ID和觸發自定義驗證的​​。

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:c="http://java.sun.com/jstl/core" 
    xmlns:a4j="http://richfaces.org/a4j" 
    xmlns:rich="http://richfaces.org/rich" 
    template="/WEB-INF/template/default.xhtml"> 

    <ui:param name="title" value="Conditional Validation"/> 
    <ui:param name="bean" value="#{conditionalValidationBean}"/> 

    <ui:define name="content"> 
     <a4j:form id="frmConditionalValidation"> 
      <h:panelGrid columns="2"> 
       <h:outputLabel for="txtValue1" value="Value 1"/> 
       <h:panelGroup> 
        <h:inputText id="txtValue1" value="#{bean.value1}"/> 
        <h:message for="txtValue1"/> 
       </h:panelGroup> 
       <h:outputLabel for="txtValue2" value="Value 2"/> 
       <h:panelGroup> 
        <h:inputText id="txtValue2" value="#{bean.value2}"/> 
        <h:message for="txtValue2"/> 
       </h:panelGroup> 
      </h:panelGrid> 
      <h:inputHidden id="inpDetailsProvider" required="true" 
       validator="#{bean.conditionalValidator}" value="1"> 
       <f:attribute name="forceValidationBtnId" value="btnForceValidation"/> 
       <f:attribute name="value1InputId" value="txtValue1"/> 
       <f:attribute name="value2InputId" value="txtValue2"/> 
      </h:inputHidden> 
      <h:commandButton id="btnForceValidation" value="Force Validation"/> 
      <h:commandButton id="btnByPassValidation" value="Bypass Validation"/> 
     </a4j:form> 
    </ui:define> 
</ui:composition> 

ConditionalValidationBean.java

public class ConditionalValidationBean { 

    private String value1; 
    private String value2; 

    @SuppressWarnings("unused") 
    public void conditionalValidator(FacesContext context, UIComponent component, Object value) { 
     String forceValidationBtnId = (String) component.getAttributes().get("forceValidationBtnId"); 
     String value1InputId = (String) component.getAttributes().get("value1InputId"); 
     String value2InputId = (String) component.getAttributes().get("value2InputId"); 

     UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot(); 
     UICommand forceValidationBtn = findComponent(viewRoot, forceValidationBtnId, UICommand.class); 

     Map<String, String> params = context.getExternalContext().getRequestParameterMap(); 
     boolean forceValidation = params.containsKey(forceValidationBtn.getClientId(context)); 

     if(forceValidation) { 
      UIInput value1Input = findComponent(viewRoot, value1InputId, UIInput.class); 
      UIInput value2Input = findComponent(viewRoot, value2InputId, UIInput.class); 

      String v1 = (String) value1Input.getValue(); 
      if(v1 == null || v1.trim() == "") { 
       value1Input.setValid(false); 
       FacesMessage valueRequiredMsg = new FacesMessage("Value required"); 
       context.addMessage(value1Input.getClientId(context), valueRequiredMsg); 
      } 

      // Rest of validation logic. 
     } 
    } 

    public static <T> T findComponent(UIComponent base, String id, Class<T> returnType) { 
     if (id.equals(base.getId())) { 
      return returnType.cast(base); 
     } 

     Iterator<UIComponent> children = base.getFacetsAndChildren(); 

     while (children.hasNext()) { 
      T found = findComponent(children.next(), id, returnType); 

      if (found != null) { 
       return returnType.cast(found); 
      } 
     } 

     return null; 
    }  

    public String getValue1() { 
     return value1; 
    } 

    public String getValue2() { 
     return value2; 
    } 

    public void setValue1(String value1) { 
     this.value1 = value1; 
    } 

    public void setValue2(String value2) { 
     this.value2 = value2; 
    } 

} 
+0

謝謝。它有幫助。衆議員++ – Prabhat 2011-04-14 12:39:52