我在dataTable中有一个p:inputText
字段,我正在尝试动态设置它的标识符。
但是我收到以下错误:
组件标识符不能是零长度字符串
用作id的字符串都不是null或零长度
<h:form id="updateform">
<p:dataTable id="updatetable" value="#{EditingBean.row}" var="column"
style="width: 983px; overflow-x: auto; white-space: normal;">
<f:facet name="header">
<h:outputText value="#{EditingBean.currentStatement.statementName}" />
</f:facet>
<p:column rendered="#{column.display}" style="white-space: normal;">
<h:outputText value="#{column.alias}" />
</p:column>
<p:column rendered="#{column.display}" style="white-space: normal;">
<p:inputText id="#{column.name}" value="#{column.value}" />
</p:column>
<f:facet name="footer" style="text-align: right;">
<h:commandButton value="Update" action="#{EditingBean.update()}"
ajax="false" />
</f:facet>
</p:dataTable>
</h:form>
答案 0 :(得分:2)
必须在视图构建期间设置id
属性。
但是,当#{column}
声明为<h:dataTable var>
时,它仅在视图渲染时间内可用。由于它在视图构建时间之后运行,因此在视图构建期间null
。
我不确定具体的功能要求,您认为这样做是正确的解决方案。代码不是自我记录足以正确猜测它。所以很难给出合适的答案。无论如何,你基本上有两个选择:
使用在视图构建期间运行的迭代标记,例如JSTL <c:forEach>
。
<c:forEach items="#{EditingBean.row}" var="column">
...
<p:inputText id="#{column.name}" ... />
您可能实际上根本不需要动态ID。给它一个固定的ID。
<p:inputText id="name" ... />
JSF已经开始在HTML输出中生成唯一ID(带有行索引前缀)。右键单击页面并执行查看源以自行查看。