重复ID。 JSF

时间:2009-09-15 16:46:44

标签: jsf ajax4jsf

我遇到了JSF的问题。任何人都可以说为什么这不起作用?

<h:selectOneListbox
  id="lang" size="5"
  value="#{MbInstitution.node.lang}"
  valueChangeListener="#{MbInstitution.changeLanguage}"
  rendered="#{MbInstitution.view}"
  >
 <a4j:support event="onchange" reRender="shortDesc, fullDesc"/>
 <f:selectItems value="#{MbInstitution.languagesByInstitute}"/>
</h:selectOneListbox>
<h:selectOneListbox
  id="lang" size="5"
  disabled="#{!MbInstitution.managingNew}"
  value="#{MbInstitution.node.lang}"
  rendered="#{!MbInstitution.view}"
  >
 <f:selectItems value="#{MbInstitution.availableLanguages}"/>
</h:selectOneListbox>

它说:“组件instForm:lang的重复Id” 我知道我有2个具有相同Id的元素,但只有当另一个不是时,才会渲染一个元素。所以,我认为这不是一个问题。实际上它根本不是一个大问题,因为我不需要这个ID,但如果我需要那么我该怎么办?

2 个答案:

答案 0 :(得分:11)

您的问题是这两个组件是此页面的JSF组件树的一部分。即使它们无法同时显示,它们也会共享相同的ID,这是JSF不允许的。

我看到三种解决方案来解决您的问题:

第一个解决方案:定义两个不同的ID

第二个解决方案:正如Wayne Young所解释的,您可以使用NamingContainer,它将使用NamingContainer的ID为其ID添加前缀。

第三个解决方案:只使用一个<h:selectOneListbox/>,然后在Java代码中发挥作用。

<h:selectOneListbox id="lang" size="5" disabled="#{!MbInstitution.managingNew}" value="#{MbInstitution.node.lang}" valueChangeListener="#{MbInstitution.changeLanguage}">
    <a4j:support event="onchange" reRender="shortDesc, fullDesc" rendered="#{MbInstitution.view}"/>
    <f:selectItems value="#{MbInstitution.languages}"/>
</h:selectOneListbox>

Java代码:

public List<SelectItem> getLanguage() {
    if (isView()) {
        return getLanguagesByInstitute();
    } else {
        return getAvailableLanguages();
    }
}

public void changeLanguage(ValueChangeEvent evt) {
    if (!isView()) {
        return;
    }
    ...
}

答案 1 :(得分:1)

您必须使用其他ID或将其放在另一个命名容器中。

Javadoc for UIComponent.setId()说:

  

指定的标识符必须是   在所有组件中独一无二   (包括方面)是   最近的祖先的后代   作为NamingContainer的UIComponent,   或在整个范围内   组件树,如果没有这样的   祖先是一个NamingContainer。