2013-07-18 144 views
1

我對我的selectOneMenu進行了驗證,以防止用戶在列表中選擇「無」項。JSF selectOneMenu驗證和ajax渲染

<h:selectOneMenu id="selectMenu" value="#{bean.selectedValue}" required="true" requiredMessage="Please select an item"> 
    <f:ajax render="toRender selectMenuMessage" listener="#{bean.onSelect}"/> 
    <f:selectItem itemLabel="None" noSelectionOption="true"/> 
    <f:selectItems value="#{bean.items}" var="item" itemValue="#{item.id}" itemLabel="#{item.label}"/> 
</h:selectOneMenu> 

下面我有我的面板和希望展示它,只有當我的項目是不是「無」。 所以當我選擇「無」時,消息應該呈現並且面板消失。

<h:panelGroup id="toRender"> 
    <h:panelGrid rendered="#{bean.selectedValue == 0 ? false : true"> 
     ... 
    </h:panelGrid> 
</h:panelGroup> 

它的工作沒有驗證,但我不能使兩個工作..這就像是如果驗證防止渲染。

有什麼建議嗎? 感謝

回答

1

我想這bean.selectedValue是一個整數,那麼試試這個:

<f:selectItem itemValue="0" itemLabel="None" noSelectionOption="true"/> 


編輯: 不好意思啊,我覺得誤解你的問題一點點。
這裏的問題是,如果您要爲selectOneMenu設置一個值,則該值如果爲空則不會提交。如果選擇了 noSelectionOption="true"的項目,它將作爲空處理,因此不會提交任何值。當你在對 bean.selectedValue == 0進行檢查時, selectedValue將永遠不會 - 除了最初可能爲0以外,因爲當你選擇值爲0的項目時,它將不會被提交,如上所述。
所以你是對的,你的驗證和 bean.selectedValue == 0的檢查不能一起工作。我會建議你只刪除驗證。
如果這不是您的選擇,請解釋我爲什麼需要它以更詳細的方式工作。

+0

這不會改變任何東西。出現的消息(如果我選擇converterMessage而不是requiredMessage btw)但渲染不會被觸發,我的panelGrid不會消失。 –

+0

感謝您的編輯,這次你很好理解,是的解決方案是在提交後選擇驗證和渲染。 –

0

我有一個反應,它不是解決方案,但它是另一種方式來做到這一點...

<h:selectOneMenu id="selectMenu" value="#{bean.selectedValue}"> 
    <f:ajax render="toRender selectMenuMessage" listener="#{bean.onSelect}"/> 
    <f:selectItem itemLabel="None" noSelectionOption="true"/> 
    <f:selectItems value="#{bean.items}" var="item" itemValue="#{item.id}" itemLabel="#{item.label}"/> 
</h:selectOneMenu> 

而且在豆

public void onSelect() { 
    if(this.selectedValue != 0) { 
     // Do smthg here 
    } else { 
     // Display error message 
     UIComponent component = Outils.getFacesContext().getViewRoot().findComponent(":form:selectMenu"); 
     if(component != null) { 
      Outils.getFacesContext().addMessage(component.getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "Test msg")); 
     } 
    }  
} 

這樣的驗證過程沒有啓動,驗證在bean中完成。

如果有人發現更好的東西,讓我知道!

+0

我更新了我的答案,請檢查我現在是否有問題。 – user1983983