2012-10-10 69 views
0

我有一個包含多個組件的窗體,其中一些窗體有自己的驗證和/或是必需的。然後,我也有幾個selectOneMenu組件在其列表中具有相同的三個selectItem元素。我已經定義了三個commandButton,以便爲所有列表(每個可能值一個commandButton)選擇相同的值。JSF - 驗證前從視圖更新模型值

的JSF部

<table> 
    <tr> 
     <td> 
      <h:outputText value="ID:" /> 
     </td> 
     <td> 
      <h:inputText value="#{MyClass.id}" id="inTxt_id" required="true"> 
       <f:validator validatorId="CheckIDPattern" /> 
      </h:inpuText> 
      <h:message for="inTxt_id" errorClass="error" /> 
     </td> 
    </tr> 
</table> 
<table> 
    <tr> 
     <td> 
      <h:commandButton value="Select all opt1" action="#{MyClass.selectOpt1}" /> 
      <h:commandButton value="Select all opt2" action="#{MyClass.selectOpt2}" /> 
      <h:commandButton value="Select all opt3" action="#{MyClass.selectOpt3}" /> 
     </td> 
    </tr> 
    <tr> 
     <td> 
      <h:outputText value="List 1:" /> 
     </td> 
     <td> 
      <h:selectOneMenu value="#{MyClass.list1Val}"> 
       <f:selectItems value="#{MyClass.listOfOptions}" /> 
      </h:selectOneMenu> 
     </td> 
    <tr> 
     <td> 
      <h:outputText value="List 2:" /> 
     </td> 
     <td> 
      <h:selectOneMenu value="#{MyClass.list2Val}"> 
       <f:selectItems value="#{MyClass.listOfOptions}" /> 
      </h:selectOneMenu> 
     </td> 
    </tr> 
    <tr> 
     //Many other selectOneMenu components... 
    </tr> 
</table> 
<h:commandButton action="#{MyClass.saveLists}" value="Submit" /> 

MyClass.java

public String selectOpt1(){ 
    this.list1Val = 1; 
    this.list2Val = 1; 
    //... 
    return ""; 
} 

//The same idea for selectOpt2 and selectOpt3. 

在這種情況下,如果我的用戶按下的我的 「全選」 按鈕一個沒有填充所述ID inputText,它收到錯誤信息,但我不想要它,因爲我想他們還沒有完成填寫表單。我只想在用戶按下「保存列表」按鈕時執行驗證。

我試着將immediate="true"添加到我的「全選」按鈕中,它可以工作,但它不會更新模型中的視圖,然後用戶看不到值已經更改...所以它確實沒有工作。

我想達到什麼目的?我只想在最後一個按鈕(提交)時執行驗證。所以我的用戶可以使用這些「全選」按鈕,而不必填寫以前的強制性組件。

我希望你能理解我的背景。隨意要求澄清。 在此先感謝。

回答

2

如果您使用@ViewScoped豆你可以做以下修改:

首先改變你的selectOpt1法鍵入void

public void selectOpt1() 
{ 
    this.list1Val = 1; 
    this.list2Val = 1; 
    //... 
} 

舉一個id您要在選擇更新組件項目。我假設列表1在這種情況下:

<h:selectOneMenu id="list1" value="#{MyClass.list1Val}"> 
    //... 
</h:selectOneMenu> 

而在你的按鈕,添加一個f:ajax標記,部分只提交該組件進行處理:

<h:commandButton value="Select all opt1" action="#{MyClass.selectOpt1}"> 
    <f:ajax execute="@this" render="list1" /> 
</h:commandButton> 

如果您打算更新多個組件,您可能添加他們的ID由空格分隔:

<f:ajax execute="@this" render="list1 list2" /> 

我希望它有幫助。

編輯

嗯,對不起,我沒有注意到你正在使用JSF 1.x的在這種情況下,它不會工作。

雖然您可以使用庫如RichFaces添加ajax功能。請看看這些主題:

RichFaces的

至於你提到你使用RichFaces的,你可以在f:ajax標籤切換到a4j:support

<h:commandButton value="Select all opt1" action="#{MyClass.selectOpt1}"> 
    <a4j:support event="onclick" reRender=":list1" ajaxSingle="true" /> 
</h:commandButton> 

或者這樣使用a4j:commandButton

<a4j:commandButton value="Select all opt1" reRender=":list1" ajaxSingle="true" /> 

有關此行爲的更多信息,請看一看this

問候。

+0

嗯...這個bean會話範圍,但我正在** JSF 1.2 **(因爲某些原因我已經無法遷移到JSF 2.0 :()。可這是解決方案適合我的JSF版本?謝謝! – jmrodrigg

+0

好吧,這對JSF 1.x不起作用。一種選擇是使用像RichFaces這樣的庫,因爲這增加了ajax功能。我在過去使用它,它是一種易於入門查看我的編輯 – rbento

+0

感謝您的回答,它肯定是我的錯,我沒有詳細說明我使用的是什麼技術,是的,我也使用RichFaces,我使用'a4j:support',但是我不能正確地解決問題,謝謝你的相關話題,我會研究它 – jmrodrigg

0

考慮到本篤的建議,我真正想讓它工作的唯一方法就是使用AJAX a4j

我已經在我的代碼引入的變化是:

  1. 更換h:commandButton「全選」按鈕與a4j:commandButton
  2. Define id標籤爲我的h:selectOneMenu組件,所以我可以reRender組件通過以前定義的a4j:commandButton

JSF原來的頁面已被修改如下:

(...) 
<table> 
    <tr> 
     <td> 
      <a4j:commandButton value="Select all opt1" action="#{MyClass.selectOpt1}" 
       reRender="list1,list2,(...)" ajaxSingle="true" /> 
      <a4j:commandButton value="Select all opt2" action="#{MyClass.selectOpt2}" 
       reRender="list1,list2,(...)" ajaxSingle="true" /> 
      <a4j:commandButton value="Select all opt3" action="#{MyClass.selectOpt3}" 
       reRender="list1,list2,(...)" ajaxSingle="true" /> 
     </td> 
    </tr> 
    <tr> 
     <td> 
      <h:outputText value="List 1:" /> 
     </td> 
     <td> 
      <h:selectOneMenu value="#{MyClass.list1Val}" id="list1"> 
       <f:selectItems value="#{MyClass.listOfOptions}" /> 
      </h:selectOneMenu> 
     </td> 
    </tr> 
    <tr> 
     <td> 
      <h:outputText value="List 2:" /> 
     </td> 
     <td> 
      <h:selectOneMenu value="#{MyClass.list2Val}" id="list2"> 
       <f:selectItems value="#{MyClass.listOfOptions}" /> 
      </h:selectOneMenu> 
     </td> 
    </tr> 
(...) 

非常感謝盒飯您的意見!

2

只要讓required屬性取決於按下按鈕。

<h:form id="form"> 
    <c:set var="saveButtonPressed" value="#{not empty param['form:save']}" /> 
    ... 
    <h:inputText ... required="#{saveButtonPressed}" /> 
    ... 
    <h:commandButton id="save" ... /> 
</h:form> 
+0

謝謝你採用這種不同的方法。我不知道這是可能的。雖然'a4j:commandButton'更適合我的目的,很高興知道不同的解決方案。謝謝! – jmrodrigg

+0

不客氣。 – BalusC

+0

@BususC THX很多次!我花了數小時尋找這樣的解決方案! – ProgrammingIsAwsome