2012-11-16 129 views
2

我有以下的JSF 2代碼:JSF 2:需要下拉時,不能選擇下拉列表元素默認項和默認項爲無效

<p:selectOneMenu id="dropdown" value="#{data.selection}" required="true" converter="selectOneMenuConverter"> 
      <f:selectItem itemLabel="Select one..." itemValue="" noSelectionOption="true" /> 
      <f:selectItems value="#{data.entries}" var="entry" itemLabel="#{entry.name}" itemValue="#{entry}" /> 
      <p:ajax update="display" event="change" /> 
    </p:selectOneMenu> 

    <h:panelGroup id="display"> 
      <h:outputText value="#{data.selection}" /> 
    </h:panelGroup> 

一切正常,當我從下拉值如預期。 當用戶通過選擇「Select One」「取消」一個條目時,JSF抱怨這是不可能的,因爲selectonemenu是必需的。

問題來自那裏,p:ajax使部分提交觸發驗證。 Immediate = true也不起作用,因爲如果立即發生在輸入字段上(如selectonemenu),則執行驗證。 只有當用戶按下頁面底部的「go on」按鈕(未在代碼中顯示)時,驗證纔會發生

進一步給定的轉換器將字符串轉換爲對象,併爲默認值返回null(這也是「沒有選擇」的域內預期值)。

所以我的問題是我必須做什麼來完成我的情況。 對於我來說這是一個標準案例,我無法想象沒有解決方案。

任何想法?

最好的問候, 弗洛裏安

回答

3

當用戶按下確認應只發生了「繼續」按鈕的頁面(代碼未顯示)

底部然後只要告訴下拉的required屬性就可以做到這一點,而不是硬編碼true

<h:form id="form"> 
    <p:selectOneMenu ... required="#{not empty param['form:go']}"> 
     ... 
    </p:selectOneMenu> 

    ... 

    <p:commandButton id="go" ... /> 
</h:form> 

當表單提交實際上已被提交按鈕,其具有在特定的示例中的客戶機ID form:go發生的#{not empty param['form:go']}將僅評估true。如果您不喜歡硬編碼的客戶端ID,請參考如下:

<h:form> 
    <p:selectOneMenu ... required="#{not empty param[go.clientId]}"> 
     ... 
    </p:selectOneMenu> 

    ... 

    <p:commandButton binding="#{go}" ... /> 
</h:form> 
+0

非常感謝。有用。 –

+0

不客氣。 – BalusC

+0

嗨,這是我的一次。我們遇到一個很奇怪的問題。具有param和clientId的東西在文本字段上工作,但不在p:selectOneMenu上。我們在每個地方都有文本框和下拉菜單中的required =「not empty param ...」el。在「去」按鈕我們有一個綁定,並在「保存」按鈕,我們沒有約束力。現在當我按下「保存」按鈕時,所有selectOneMenus都會變成紅色,提示驗證失敗。 –