我正在使用< ui:repeat>构建一个表格标签,它的长度是动态的。每行都有一个< h:inputText>领域。提交表单时,它会将表单中的值设置为散列映射。除了验证之外,一切都很好。我需要告诉< h:message>它使用“for”属性输入哪个输入。我已经尝试根据用于创建行的项目的名称,每行创建一个唯一的ID。但是< h:message>提交无效输入时,tag仍然为空,我在服务器日志(JBoss 7.1)上得到以下输出:
[javax.enterprise.resource.webcontainer.jsf.renderkit]
Unable to find component with ID nTAS in view.
这是XHTML:
<ui:repeat var="item" ...>
...
<h:inputText value="#{bean.chosenItems[item.name]}" id="n#{item.name}" >
<f:validateLongRange minimum="0" maximum="10" />
</h:inputText>
<h:message for="n#{item.name}" />
...
</ui:repeat>
为了至少在浏览器中收到某种错误消息,我还在页面顶部添加了这个消息,并且它可以正常工作:
<h:messages styleClass="error" />
显示以下消息:
j_idt13:j_idt17:1:n: Validation Error: Value is not of the correct type.
这种情况表明问题的一部分,因为ID是消息开头的奇怪代码,它以“n”开头,但不包含项目的名称。如果我在浏览器中查看源代码,则ID实际为:id="j_idt13:j_idt17:1:nTAS"
如果我查看表格之外的其他组件,它们也有神秘的ID,显然是由JSF生成的。
真正奇怪的是,当我第二次输入“asdf”并重新提交表单时,它会在bean上调用action方法,而不是在验证阶段再次失败!怎么会这样?!
感谢任何提示, 约翰
答案 0 :(得分:5)
您无法使用el表达式动态创建ID。如果你没有为组件分配ID,那么“神秘”的ID确实是由jsf生成的。
但您不需要在ui:repeat
中关注您的ID的唯一性。 JSF为您完成(生成的id字符串中的“1”是重复组件的计数器)。只需为输入字段指定一个“固定”ID,并在h:message中引用它:
<h:inputText value="#{bean.chosenItems[item.name]}" id="myID" >
<f:validateLongRange minimum="0" maximum="10" />
</h:inputText>
<h:message for="myID" />