无法动态设置组件标识符

时间:2013-08-06 12:49:09

标签: jsf-2 primefaces identifier

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

1 个答案:

答案 0 :(得分: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(带有行索引前缀)。右键单击页面并执行查看源以自行查看。

  3. 另见: