2013-02-15 34 views
3

我想在用戶執行操作之前驗證表單中的兩個日期。所以我在一個使用ajax的p:calendar裏面有一個f:validator,問題在於f:屬性。我將開始日期作爲參數傳遞,驗證器不會收到此日期。但是,如果按動作按鈕,日期參數在驗證中。我用這個post作爲指導。 我XHTML是:JSF中的<f:validator>和ajax問題

<p:column > 
         <p:calendar id="txtStartDate" binding="#{txtStartDate}" 
          pattern="dd/MM/yyyy" 
          value="#{myBean.bean.startDate}">        
         </p:calendar> 
        </p:column> 
        <p:column> 
         <p:calendar id="txtEndDate" 
          pattern="dd/MM/yyyy" 
          value="#{myBean.bean.endDate}"> 
          <f:validator validatorId="validator.dateRangeValidator" /> 
          <f:attribute name="fromDate" value="#{txtStartDate.value}" />         
          <p:ajax event="dateSelect" execute="@Form" update=":formHeader:messages" /> 
         </p:calendar> 
        </p:column> 

和確認:

@Override 
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { 
    if (value == null || component.getAttributes().get("fromDate") == null) return; 

    Date endDate = (Date) value; 
    Date startDate = (Date) component.getAttributes().get("fromDate"); 

    if (!endDate.after(startDate)) { 
     FacesMessage message = new FacesMessage("End date before the start date."); 
     message.setSeverity(FacesMessage.SEVERITY_ERROR); 
     addMessageOnSession(FacesMessage.SEVERITY_ERROR, "Invalid dates"); 
     throw new ValidatorException(message); 
    } 
} 

欣賞與任何幫助。

+0

EL表達''{myBean.bean.startDate}'有點奇怪。是'#{myBean}'指定爲''? – BalusC 2013-02-15 18:37:22

+0

不,myBean是我的@ManagedBean,它包含一個名爲bean的屬性,它擁有date屬性。 – 2013-02-15 20:25:16

+0

所以......每行中的日曆輸入提交給同一個bean屬性,覆蓋前一行提交的所有值,直到最終只有最後一行的值爲止?爲什麼這種方法?像在'中指定的那樣,將它們的值綁定到當前迭代的行對象是否更有意義? – BalusC 2013-02-15 20:43:27

回答

0

無論如何,我的一個快速解決方案是在ajax標籤中添加一個listener =「」,所以我正在對bean進行驗證。我不知道這是否是最好的方法來解決我的問題。

1

有一對夫婦的,我在這裏看到的問題:

execute="@Form" 

以上是不正確。如果你想執行整個表格,這裏的正確值是@form

糾正此問題後,txtStartDate組件應更新其綁定值並可將其設置爲txtEndDate的屬性。

+0

我試過這個,但沒有成功。此外,我試圖只執行txtStartDate和txtEndDate,但沒有成功。 – 2013-02-15 15:01:56