2011-11-26 55 views
1

我有一個IceFaces表單,上面有幾個HtmlCommandButtons。我有一些附加驗證器的輸入字段。驗證工作正常,但即使按按鈕不同於提交按鈕,也會運行並阻止該過程。邏輯,因爲我所有的按鈕基本相同。問題是:如何區分驗證方面的按鈕?在特定的按鈕按下禁用ICEFaces表單上的驗證

我無法提供XHTML代碼片段,因爲我的表單是從Java代碼動態構建的。這些按鈕創建這樣:

HtmlCommandButton comp = new HtmlCommandButton(); 
    comp.setId("btn" + StringUtil.toId(label) + "_" + action); 
    comp.setTitle(label); 
    comp.setValue(label); 
    comp.setStyleClass("commandexbutton commandexbutton-" + StringUtil.toId(label)); 
    comp.addActionListener(JSFBuilderHelper.createActionListener(getActionListenerStr())); 
    comp.setPartialSubmit(true); 
+0

取決於目的的按鈕。有問題的按鈕應該做什麼? – BalusC

+0

該按鈕執行某種'取消'操作(關閉表單,從表單中恢復以前的表單,在應用程序中廣播消息等等。) – jabal

+0

好吧,直截了當,我發佈了一個答案。 – BalusC

回答

1

在最簡單的,你可以在UICommand組件的immediate屬性設置爲true。然後它將跳過UIInput組件的處理,其中不是具有此屬性爲true

comp.setImmediate(true); 

有關此屬性用法的詳細說明,請參閱this answer的後半部分。

如果這不是一種選擇,那麼你最好的選擇是放在一個單獨的形式取消按鈕,使其有效地就像結束了:

<h:form> 
    input fields 
    submit button 
</h:form> 
<h:form> 
    cancel button 
</h:form> 

如果這也不是一個選擇,由於設計/佈局限制(閱讀:不能通過CSS/JS解決),那麼你基本上需要檢查每個驗證器哪個按鈕被按下。您可以通過請求參數映射中按鈕的客戶端名稱(ID)進行檢查。例如,如組件的屬性:

required="#{not empty param['formId:submitButtonId']}" 

required="#{empty param['formId:cancelButtonId']}" 

或驗證器的validate()方法的開始:

if (externalContext.getRequestParameterMap().get("formId:submitButtonId") == null) { 
    return; // Skip validation when normal submit button is not pressed. 
} 

if (externalContext.getRequestParameterMap().get("formId:cancelButtonId") != null) { 
    return; // Skip validation when cancel button is pressed. 
} 
+0

我想在窗體上混合即時組件和非即時組件。如果我將backButton的立即設置爲true,那麼它仍然會驗證這些組件。是否也可以解決這個問題..? – jabal

+0

是的,但不幸的是,這變得更加複雜。最簡單的方法是將按鈕放在單獨的(不嵌套!)表單中。這對你有可能嗎?如果不是,那麼你需要告訴你想要跳過什麼樣的驗證。只需要「驗證」?或者還有其他所有(自定義)驗證器? – BalusC

+0

嵌套形式聽起來很難。我添加了一個驗證器到我的輸入字段是這樣的:'textbox.addValidator(new RegExpValidator(validatorExpr));' – jabal