2009-12-23 65 views
1

我有一個更新窗體,使用複合鍵所有組合鍵都顯示在輸出框中,因爲每個複合鍵都有隱藏字段。驗證錯誤後,這些輸出框值爲空。我該如何解決這個問題。我在同一個頁面上,所以它沒有價值。JSF驗證錯誤,丟失值

回答

2

這的確是​​的非直觀的行爲(我曾經在鑽嘴魚科的問題清單提交了issue反對,但他們似乎並沒有用它做任何事情)。整個問題是,組件的值不必要的是進入整個驗證週期,而沒有用戶控制輸入的手段。驗證失敗時它會丟失。至少有三種方法可以解決這種非直觀的行爲。

第一種方式是使用在​​而不是binding

<h:inputHidden binding="#{bean.hidden}" /> 

這樣的值不會發生不必要的驗證週期。然而,這需要在支持bean代碼中獲取/設置值的方式進行更改。例如:

private HtmlInputHidden hidden = new HtmlInputHidden(); // +getter +setter. 

public void setHiddenValue(Object hiddenValue) { 
    hidden.setValue(hiddenValue); 
} 

public Object getHiddenValue() { 
    return hidden.getValue(); 
} 

二(和IMHO的首選方式)是使用Tomahawkt:saveState代替。

<t:saveState value="#{bean.property}" /> 

主要優點是您不需要更改支持bean代碼中的任何內容。它將在應用請求值階段提前恢復該值。你只需要添加額外的庫,如果還沒有完成的話,但是Tomahawk比t:saveState提供更多的優勢,比如基本的JSF實現丟失的組件/功能t:inputFileUpload,t:dataList,t:dataTable preserveDataModel="true"t:selectOneRadio layout="spread"等等,它是值得的努力。

第三種方法是將其存儲在會話範圍的bean中,但實際上不希望爲請求範圍的變量執行此操作。它只會給「wtf?」在最終用戶在同一會話中打開多個選項卡/窗口時的體驗。