2010-12-13 39 views
2

這是問題所在,JSF驗證一直在將字段翻轉回最後一個已知值。繞過用於UIInput組件的JSF驗證

我們正在編輯一個支持bean已經有值的頁面。 (頻率=「每週」)

我們需要顯示「請選擇..」的默認值,即使該值不會通過驗證(是的,我只是想讓用戶在頁面上錯誤消息)。

有沒有什麼辦法可以讓用戶選擇「Select ..」並且不會將它重置爲最後的好值?

用戶不會被允許明顯保存,但我們希望保留其無效值。

  1. 用戶增加了新的對象,從選擇合適的降值開始向下
  2. 用戶成功保存。
  3. 用戶點擊「編輯」,並顯示對象與已知的值(「每週」)
  4. 用戶改變「每週」到「選擇」
  5. 用戶點擊保存
  6. 驗證消息(良好),但頻率變返回上一個值「每週」(壞,我需要它繼續「請選擇..」,並讓用戶手動修復下拉菜單

immediate =「true」對inputComponents不起作用commandComponents。

回答

3

我知道掌握這一點,我已經在一年多前報告爲JSF issue 1299。由於它的優先級低,所以仍然沒有解決。這不是特定於所有UIInput組件,而是MenuRenderer,它負責呈現HTML <select>元素。所有其他HTML輸入元素的行爲與您所期望的相同,所提交的值將被重新顯示(當然,這實際上並不如此)。

由於您已經使用JSF 2.0,因此我建議您在f:ajax的幫助下解決此問題,以便下拉列表不會被重新渲染並保留其選擇。

<h:selectOneMenu id="frequency" value="#{bean.frequency}" required="true"> 
    <f:selectItems value="#{bean.frequencies}" /> 
    <f:ajax render="frequencyMessage" /> 
</h:selectOneMenu> 
<h:message id="frequencyMessage" for="frequency" /> 

額外的好處是終端用戶有即時反饋,這對用戶體驗更好。

+0

謝謝Balus! 我玩過這一點,但一旦用戶點擊「提交」的價值仍然會恢復它不會?或者,當整個頁面在提交後重新呈現時(我認爲它不會),這個呈現也適用。 – Eddie 2010-12-15 15:22:33

+0

也使用ajax。如果需要,在'h:commandButton'裏面加'',並在消息ID上加上'render'。 – BalusC 2010-12-15 15:28:26

+0

這是現場反饋的便利技巧,並立即顯示他們的錯誤。 但即使在我的命令按鈕中使用render =「messageList」(我在按鈕上方使用單個messgae框)中的ajax,保存操作仍然會將messageList翻轉回預驗證值。 ..... 也許我會讓實況信息閱讀「這個值是必需的,如果沒有設置,將返回到先前的值」 – Eddie 2010-12-15 16:38:58