在 h:dataTable 中忽略 JSF 输入 ID

Posted

技术标签:

【中文标题】在 h:dataTable 中忽略 JSF 输入 ID【英文标题】:JSF Input ID ignored inside h:dataTable 【发布时间】:2011-05-21 16:30:51 【问题描述】:

我有一个包含动态表单文本字段的简单数据表。每个字段都有一个在支持 bean 中定义的 ID,所以我想使用该 ID 来识别每个 h:inputText 字段。

<h:dataTable id="fieldTable" value="#bean.indexFields" var="item">
  <h:column id="column">
    <h:inputText id="#item.id" value="#bean.values[item.id]" />
  </h:column>
</h:dataTable>

当我尝试查看页面时,JSF 生成错误:The id attribute may not be empty

如果我在输入 ID 属性中添加一个常量,它可以工作,但是查看生成的 ID 项目的 ID 不包括在内:

<h:inputText id="#item.idabc" value="#bean.values[item.id]" />

这会生成以下输出:

<table id="form:fieldTable">
  <tbody>
    <tr>
      <td><input id="form:fieldTable:0:abc" type="text" name="form:fieldTable:0:abc" title="" /></td>
    </tr>
    <tr>
      <td><input id="form:fieldTable:1:abc" type="text" name="form:fieldTable:1:abc" title="" /></td>
    </tr>
    <tr>
      <td><input id="form:fieldTable:2:abc" type="text" name="form:fieldTable:2:abc" title="" /></td>
    </tr>
  </tbody>
</table>

有没有办法将迭代项中的 id 包含在输入 id 属性中?为什么省略了ID?

【问题讨论】:

【参考方案1】:

为什么省略ID?

因为视图树中只有一个组件。只有它生成的输出会重复。 #item 在视图构建期间不可用。

为什么需要不同的 ID?只要给它一个固定的ID。 JSF 将注意其在生成的 html 输出中的唯一性。生成的 ID 非常可预测,如果您愿意,您可以通过 javascript 轻松地使用它。

【讨论】:

这是一个很好的观点 - 我不一定关心 ID。我遇到了这个问题,因为我正在使用 ui:composition 生成一个复合控件,其中包含一个标签,后跟一个文本输入字段。复合控件上指定的 ID 用于标签和输入字段(分别为“#idLabel”和“#id”)。

以上是关于在 h:dataTable 中忽略 JSF 输入 ID的主要内容,如果未能解决你的问题,请参考以下文章

JSTL c:forEach 在 JSF h:dataTable 中不起作用

如何在没有 JSF 标记库(h:datatable 或 ui:repeat)的情况下编写 <table> 标记,但仍使用 JSF 来控制页面流

如何在 JSF 中动态添加 <h:inputtext>? [复制]

如何在 h:dataTable 中实现行编号

JSF 命令按钮

c:when 和 c:if 带有来自 h:dataTable var [重复] 的动态参数