1

这个问题似乎很简单,但我没有发现错误。

好的,我们开始吧:我有一个带有 IP 列表(无论如何)的表单,
IP n:[INPUT-FIELD] [Button "Add"]
IP n+1 : [INPUT-FIELD] [Button "Add"]
这些IP 从一开始就存在。它们在托管 Bean 的构造函数中初始化。

当我单击“添加”按钮时,将验证当前 IP。之后,我将另一个条目添加到我的 java.util.List 中,并出现 JSF 表单中的另一行:

IP n+2 : [输入字段] [按钮“添加”]

等等。

添加一行(使用新 IP)并验证当前 IP 非常适合现有值IP nIP n+1,但验证和添加不适用于动态添加的IP n+2。验证动态生成的输入字段都不起作用,也不能使用新创建的“添加”按钮添加另一行。

我究竟做错了什么?

<h:form id="frmSpecial" prependId="false">
    <h:panelGroup id="tblDestFw">
        <c:forEach items="#{bean.fwdest}" var="fwdest">
            IP: <h:inputText value="#{fwdest.ip}" validator="#{bean.validateIP}"/>
            <h:commandButton action="#{bean.addFwDest()}" 
                             value="&gt;&gt;" title="Add another line">
                <f:ajax execute="@this" render="tblDestFw"/>
            </h:commandButton>
            <br/>
        </c:forEach>
    </h:panelGroup>
</h:form>

@ManagedBean(name = "bean")
@ViewScoped
public class EnterNewSystemFW implements Serializable {
     List<FirewallDest> fwdest;
     public EnterNewSystemFW() {
         fwdest.add(new FirewallDest("N"));
         fwdest.add(new FirewallDest("N+1"));
     }

     public void addFwDest() {
         fwdest.add(new FirewallDest());
     }
}

谢谢。

伯恩德

4

1 回答 1

0

至于添加新行,您<c:forEach>引用了一个视图范围的 bean 属性。由于JSF 问题 1492,这个 bean 在每次请求时都会被重建。

将其替换为普通的 JSF 组件,如<ui:repeat>or <h:dataTable>,它将按预期工作。

<ui:repeat value="#{bean.fwdest}" var="fwdest">
    ...
</ui:repeat>

至于执行验证,您<f:ajax execute="@this">只处理当前组件(命令按钮),而不是输入。改为使用<f:ajax execute="@form">来处理整个表单。

也可以看看:

于 2012-07-31T19:34:32.263 回答