2013-03-28 36 views
4

我正在使用com.sun.faces版本2.1.18。在我的應用程序中,我有一個動態的問題列表。我使用<ui:repeat>來呈現每個問題。根據問題的類型,我呈現一種輸入組件和驗證。如果是數字範圍問題,我使用<h:inputText><f:validateLongRange>在ui中使用具有可變屬性的驗證程序:重複

我遇到的問題是<f:validateLongRange>上的minimummaximum屬性始終設置爲第一個問題的最小值和最大值。所以,當你使用驗證器的時候,第一個問題就會失敗。這是否應該發生?有沒有一種方法可以對動態生成的組件進行驗證?我希望可以在不切換到<c:forEach>的情況下解決。

代碼片段:

<ui:repeat value="#{questionnaire.questionsCollection}" 
      var="question" varStatus="status"> 
    .. 
    <h:inputText rendered="#{question.qutyId.ofTypeNumber}" 
       value="#{filledQuestionnaire.answersCollection[status.index].answerValue}"> 
    <f:validateLongRange minimum="#{question.minimumValue}" 
         maximum="#{question.maximumValue}"/> 
    </h:inputText> 
    .. 
</ui:repeat> 

我輸出#{question.minimumValue}#{question.maximumValue},並且他們有正確的價值觀我的問題。

+0

另請參閱:http://www.ninthavenue.com.au/jsf-c-foreach-vs-ui-repeat – kolossus

回答

8

這確實是指定/預期的行爲。標記處理程序的屬性(如<f:validateXxx>)在查看構建時間期間進行評估。所以他們不能引用僅在視圖渲染時間內可用的變量,例如<ui:repeat>的當前迭代變量。當你使用在視圖構建時運行的迭代器(如JSTL <c:forEach>)時,它確實會起作用。關於視圖編譯時間與視圖渲染時間的更詳細解釋如下:JSTL in JSF2 Facelets... makes sense?

您基本上遇到了與此處詳細解釋的問題相同的問題:How to set converter properties for each row of a datatable?它詳細介紹了各種解決方案。一個在特定情況下的解決方案會爲了得到它使用OmniFaces<o:validator>使所有屬性的渲染時間評測,讓您只需更換

<f:validateLongRange minimum="#{question.minimumValue}" 
        maximum="#{question.maximumValue}" /> 

通過

<o:validator validatorId="javax.faces.LongRange" 
      minimum="#{question.minimumValue}" 
      maximum="#{question.maximumValue}" /> 

按需要工作。

+0

謝謝!你救了我的一天:) –

+0

不客氣。 – BalusC

相關問題