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}and #{question.maximumValue},它们对我的问题有正确的值。

4

1 回答 1

10

这确实是指定/预期的行为。<f:validateXxx>在视图构建时评估标签处理程序的属性。因此他们不能引用仅在视图渲染期间可用的变量,例如当前迭代的<ui:repeat>. 当您使用像 JSTL 这样在视图构建期间运行的迭代器时,它确实会起作用<c:forEach>。这里给出了关于视图构建时间与视图渲染时间的更详细的解释:JSTL in JSF2 Facelets... 有意义吗?

您遇到的问题与此处详细说明的问题基本相同:如何为数据表的每一行设置转换器属性?它详细概述了各种解决方案。在您的特定情况下,其中一种解决方案是使用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 回答