【问题标题】:Assign dynamic ids to hidden fields when iterating over a collection迭代集合时为隐藏字段分配动态 id
【发布时间】:2012-05-06 02:04:33
【问题描述】:

有没有办法为h:inputHidden 组件分配动态ID?

EDIT1

在迭代元素集合时,我试图在 ui:repeat 标记内分配 ID。

【问题讨论】:

    标签: java javascript jsf primefaces


    【解决方案1】:

    默认情况下,它们会被分配一个动态 ID。也可以指定id="#{..}进行自定义。

    【讨论】:

    • 你的答案是正确的。我正在寻找一种使用 ui:repeat 在集合上创建多个隐藏输入字段的方法,发现 id 不支持 EL 值。所以我认为这适用于所有情况。
    • 我猜你可以有一个迭代变量并在ID中使用它
    【解决方案2】:

    您也可以动态添加任何随机数 (id="#{}"),但是

    功能相关的ID添加到隐藏组件,这会很有帮助

    例如,如果是员工表格,可以添加empid。

    【讨论】:

      【解决方案3】:

      无法根据<ui:repeat> 的迭代值设置ID。但无论如何你都不需要它。默认情况下,它们将根据迭代索引获得动态且唯一的 ID。

      例如

      <h:form id="form">
          <ui:repeat value="#{bean.list}" var="item">
              <h:inputHidden id="hidden" value="#{item.value}" />
          </ui:repeat>
      </h:form>
      

      将在视图渲染期间生成此 HTML

      <form id="form" name="form">
          <input type="hidden" id="form:0:hidden" name="form:0:hidden" value="item1value" />
          <input type="hidden" id="form:1:hidden" name="form:1:hidden" value="item2value" />
          <input type="hidden" id="form:2:hidden" name="form:2:hidden" value="item3value" />
      </form>
      

      如果要手动控制 ID,则需要使用 &lt;c:forEach&gt;,因为 &lt;ui:repeat&gt; 不会生成多个 JSF 组件,而是让其子级(上面是单个 &lt;h:inputHidden&gt;示例)多次生成 HTML。 &lt;c:forEach&gt; 将生成多个 JSF 组件,然后每个组件只生成一次 HTML(因此您实际上最终会在 JSF 组件树中生成多个 &lt;h:inputHidden&gt; 组件)。

      例如

      <h:form id="form">
          <c:forEach items="#{bean.list}" var="item">
              <h:inputHidden id="#{item.id}" value="#{item.value}" />
          </c:forEach>
      </h:form>
      

      基本上会在视图构建期间生成这个 JSF 组件树

      <h:form id="form">
          <h:inputHidden id="item1id" value="#{bean.list[0].value}" />
          <h:inputHidden id="item2id" value="#{bean.list[1].value}" />
          <h:inputHidden id="item3id" value="#{bean.list[2].value}" />
      </h:form>
      

      这反过来会在视图渲染期间生成此 HTML

      <form id="form" name="form">
          <input type="hidden" id="form:item1id" name="form:item1id" value="item1value" />
          <input type="hidden" id="form:item2id" name="form:item2id" value="item2value" />
          <input type="hidden" id="form:item3id" name="form:item3id" value="item3value" />
      </form>
      

      另见:

      【讨论】:

      • 感谢您的回复。您是 JSF 世界的传奇人物。我在 c:forEach 的命名空间声明中收到 NLS 缺失消息:CANNOT_FIND_FACELET_TAGLIB in: org.eclipse.jst.jsf.core.validation.internal.facelet.messages。我使用 xmlns:c="java.sun.com/jstl/core" 作为命名空间。
      • 对于 JSF2,您需要 xmlns:c="http://java.sun.com/jsp/jstl/core",在 URI 中使用 /jsp
      • 我认为您的意思是 &lt;h:inputHidden id="#{item.id}" value="#{item.value}" /&gt; 用于 ui:repeat 示例。
      • 不,我绝对不是那个意思。 &lt;ui:repeat&gt;不能这样设置ID。
      • 我得到一个异常:javax.faces.view.facelets.FaceletException: javax/servlet/jsp/jstl/core/LoopTagStatus ... 原因:java.lang.ClassNotFoundException: javax.servlet。 jsp.jstl.core.LoopTagStatus
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      • 2019-03-26
      • 2014-06-20
      相关资源
      最近更新 更多