3

我在 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>
4

1 回答 1

2

id属性必须在视图构建时设置。

但是,正如#{column}声明为<h:dataTable var>,它仅在视图渲染期间可用。由于它在视图构建时间之后运行,因此它null在视图构建时间期间。

我不确定您认为这样做是正确解决方案的具体功能要求。该代码没有足够的自我记录来正确猜测它。所以很难给出一个合适的答案。无论如何,您基本上有两种选择:

  1. 使用在视图构建期间运行的迭代标记,例如 JSTL <c:forEach>

    <c:forEach items="#{EditingBean.row}" var="column">
        ...
        <p:inputText id="#{column.name}" ... />
    
  2. 您实际上可能根本不需要动态 ID。给它一个固定的ID。

    <p:inputText id="name" ... />
    

    JSF 已经负责在 HTML 输出中生成唯一 ID(以行索引为前缀)。右键单击页面并查看源代码以自己查看。

也可以看看:

于 2013-08-06T14:20:56.040 回答