【问题标题】:<h:message> unable to find component in <ui:repeat><h:message> 无法在 <ui:repeat> 中找到组件
【发布时间】:2012-03-26 08:30:58
【问题描述】:

我正在使用 标记构建一个表格,它的长度是动态的。每行都有一个 字段。提交表单时,它将表单中的值设置为哈希图。这一切都很好,除了验证。我需要使用“for”属性告诉 它属于哪个输入。我尝试根据用于创建行的项目名称为每行创建一个唯一 ID。但是,当我提交无效输入时, 标记仍然为空,并且在服务器日志(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 上的操作方法,而不是在验证阶段再次失败!怎么可能?!

感谢您的任何提示, 约翰

【问题讨论】:

    标签: jsf


    【解决方案1】:

    您不能使用 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" />
    

    【讨论】:

    • 完美,解决了第二个问题,即表单在后续提交时没有得到验证。谢谢!
    猜你喜欢
    • 2011-05-26
    • 2013-03-19
    • 2012-03-30
    • 1970-01-01
    • 2015-11-20
    • 2013-12-08
    • 2017-09-21
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多