为复选框分配动态ID时出现问题

时间:2013-07-03 11:31:52

标签: jsf jsf-2

我尝试了以下代码:

 <ui:repeat var="item" id="request" value="#{myBean.requestList}">
    <h:selectBooleanCheckBox id="#{item.name}" value="#{item.type}"/>
    <h:outputText value="#{item.name}"/>
</ui:repeat>

我也试过

 <ui:repeat var="item" id="request" value="#{myBean.requestList}">
        <ui:param name="dynamicVal" value="#{item.name}"/>
        <h:selectBooleanCheckBox id="#{dynamicValue}" value="#{item.type}"/>
        <h:outputText value="#{item.name}"/>
  </ui:repeat>

这两个都有错误:

java.lang.IllegalArgumentException: component identifier must not be a xero-length String at javax.faces.component.UIComponentBase.isIdValid ..

这段代码有什么不对?如何将动态ID分配给标签&amp; id是一样的。我需要这个用于自动机。

1 个答案:

答案 0 :(得分:4)

在视图构建期间评估id属性,但<ui:repeat>在视图渲染时运行。从本质上讲,您的ID最终为null,这确实无效。

只是不要尝试手动分配生成ID。 <ui:repeat>已经自动在客户端ID中插入当前迭代索引。这个例子,

<h:form id="formId">
    <ui:repeat ...>
        <h:outputLabel for="checkboxId" ... />
        <h:selectBooleanCheckBox id="checkboxId" ... />
    </ui:repeat>
</h:form>

最终会像

一样
<form id="formId">
     <label for="formId:0:checkboxId">...</label>
     <input type="checkbox" id="formId:0:checkboxId" />
     <label for="formId:1:checkboxId">...</label>
     <input type="checkbox" id="formId:1:checkboxId" />
     <label for="formId:2:checkboxId">...</label>
     <input type="checkbox" id="formId:2:checkboxId" />
     ...
</form>

如果你绝对肯定你需要手动摆弄这样的ID,那么请改用<c:forEach>。它在视图构建期间运行,生成物理上多个JSF组件。您可以在<c:forEach var>属性中使用varStatusid

另见:


顺便问一下,您是否考虑过<h:selectManyCheckbox>