7

com.sun.facesバージョンを使用して2.1.18います。私のアプリケーションには、質問の動的リストがあります。私は<ui:repeat>各質問をレンダリングするために使用します。質問の種類に応じて、入力コンポーネントと検証の種類をレンダリングします。数値範囲の質問の場合は、 を使用<h:inputText><f:validateLongRange>ます。

私が遭遇する問題は、 の属性minimummaximum属性<f:validateLongRange>が常に最初の質問の最小値と最大値に設定されていることです。したがって、最初の質問以外でバリデーターを使用すると、失敗します。それは起こるはずですか?動的に生成されたコンポーネントで検証を機能させる方法はありますか? に切り替えずに解決できることを願っています<c:forEach>

コードスニペット:

<ui:repeat value="#{questionnaire.questionsCollection}"
           var="question">
  ..
  <h:inputText value="..">
    <f:validateLongRange minimum="#{question.minimumValue}"
                         maximum="#{question.maximumValue}"/>
  </h:inputText>
  ..
</ui:repeat>

と を出力#{question.minimumValue}しまし#{question.maximumValue}たが、質問に対する正しい値が含まれています。

4

1 に答える 1

10

これは確かに指定された/予期される動作です。などのタグ ハンドラの属性は、<f:validateXxx>ビューのビルド時に評価されます。そのため、現在反復されている の変数のように、ビューのレンダリング時にのみ使用できる変数を参照することはできません<ui:repeat>。JSTL のようにビューのビルド時に実行されるイテレータを使用すると、実際に機能します<c:forEach>。ビューのビルド時間とビューのレンダリング時間に関するより詳細な説明は、次のとおりです。JSF2 Facelets の JSTL... 意味がありますか?

ここで詳細に説明されているのと基本的に同じ問題があります: How to set converter properties for each row of a datatable? さまざまなソリューションについて詳しく説明しています。特定のケースでの解決策の 1 つは、すべての属性のレンダリング時の評価を可能にするOmniFacesを使用することです。 <o:validator>

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

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

希望どおりに機能させるために。

以下も参照してください。

于 2013-03-28T12:53:52.247 に答える