2014-12-04 43 views
1

我正在使用1 H顯示的項目清單:數據表像這樣:PostValidate數據表列表值

<p:dataTable value="#{myBean.instructorsList}" var="ins"> 
    <p:column headerText="Name"> 
     <h:inputText value="#{ins.name}"/>         
    </p:column> 
</p:dataTable> 

我的天賦是,我不能讓一個教練有相同的名稱作爲另一個insturctor。所以我需要在提交時訪問所有的instructorList。我試圖使用postValidate f:事件進行驗證,但是由於JSF生命週期,它不會在postValidation階段之前更新模型值。

我嘗試

<f:event listener="#{myBean.myMethod}" type="postValidate" /> 

後備代碼

private List<instructors> instructorsList; 

public void myMethod(ComponentSystemEvent event) { 

    // Attempting to use the instructorsList with new values. However, this 
    // is at the wrong stage 
} 

我怎麼會寫一個驗證完成檢查重複教練的名字呢?

+0

我不確定我是否理解這個問題。使用postValidate事件偵聽器訪問提交的名稱時遇到問題嗎?或者您在設置偵聽器中的驗證狀態時遇到問題? – kolossus 2014-12-05 21:40:37

+0

是的,我有一個訪問postValidate事件偵聽器提交名稱的問題。這些值尚未在我的viewScoped bean中更新。 – Sixthpoint 2014-12-08 04:48:05

+0

postValidate可能來不及影響請求處理。你現在究竟如何試圖訪問提交的值? – kolossus 2014-12-08 14:20:28

回答

0

在監聽器中,使用方法HtmlInputText直接從組件中提取值。另外,postValidate在驗證過程中調用問題的語義上較晚。改爲使用preValidate方法。總之,你應該有

public void myMethod(ComponentSystemEvent event) { 
     HtmlInputText txtBox = (HtmlInputText)event.getComponent(); 
     String theValue = txtBox.getSubmittedValue().toString(); //the value in the textbox 

     //based on the outcome of your validation, you also want to do the following 

     FacesContext.getCurrentInstance().setValidationFailed(); //flag the entire request as failing validation 
     txtBox.setValid(false); //mark the component as failing validation 

    } 

編輯:這種方法在很大程度上鉸鏈上,你的用戶會在同一時間內只能提交一個行的前提。在一個請求中提交整個表/列的情況下,您會發現對每個輸入字段進行一次評估對於防止競爭條件沒有多大作用;您應該考慮交叉字段驗證。

編輯2:我錯了,當事件監聽器被調用時,你不能有競爭條件。偵聽器按順序執行每一行。這使您可以安全地檢查每一行(可能對Map,重複),而不必擔心競爭條件。

+0

好的迴應,我將如何做跨場驗證?這正是我真正想要如何去做的。我不需要單獨檢查字段 – Sixthpoint 2014-12-08 20:51:32

+0

查看我的編輯@Sixthpoint – kolossus 2014-12-10 00:01:15

+0

這將滿足我的要求,因爲我可以使用Map作爲驗證點,然後維護已驗證多少個字段的計數。如果我到達最後並且條件還沒有滿足,我可以使最後一個字段無效(或者拋出一個驗證錯誤)來停止生命週期。 – Sixthpoint 2014-12-10 16:30:33