我正在使用<ui:repeat>标记构建表,其长度是动态的.每行都有一个<h:inputText>字段.提交表单时,它会将表单中的值设置为散列映射.除了验证之外,一切都很好.我需要使用"for"属性告诉<h:message>它所属的输入.我已经尝试根据用于创建行的项目的名称,每行创建一个唯一的ID.但是当我提交无效输入时,<h:message>标记仍为空,我在服务器日志(JBoss 7.1)上得到以下输出:
[javax.enterprise.resource.webcontainer.jsf.renderkit]
Unable to find component with ID nTAS in view.
Run Code Online (Sandbox Code Playgroud)
这是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>
Run Code Online (Sandbox Code Playgroud)
为了至少在浏览器中获得某种错误消息,我还在页面顶部附近添加了这个消息,它的工作原理如下:
<h:messages styleClass="error" />
Run Code Online (Sandbox Code Playgroud)
它显示以下消息:
j_idt13:j_idt17:1:n: Validation Error: Value is not of the correct type.
Run Code Online (Sandbox Code Playgroud)
这种情况表明问题的一部分,因为ID是消息开头的奇怪代码,它以"n"开头,但不包含项目的名称.如果我在浏览器中查看源代码,ID实际上是:id="j_idt13:j_idt17:1:nTAS"
如果我查看表之外的其他组件,它们也有隐藏ID,显然是由JSF生成的.
真正奇怪的是,当我第二次输入"asdf"并重新提交表单时,它会在bean上调用action方法,而不是在验证阶段再次失败!怎么可能?!
谢谢任何提示,约翰
您无法使用el表达式动态创建ID.如果你没有为组件分配ID,那么"神秘"ID确实是由jsf生成的.
但是你不需要关心你的id的独特性ui:repeat.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" />
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12459 次 |
| 最近记录: |