JSF PrimeFaces添加了多个空输入,仅在提交主表单时才需要

时间:2013-08-27 15:59:51

标签: jsf primefaces

假设我们有一张表格。一个p:inputText可见,但用户可以使用p:commandButton添加更多内容。提交另一个p:commandButton时,必须提供所有这些值。当用户尝试添加多个空输入字段时,会出现问题。所有这些都标记为required="true",因此当一个字段为空且用户尝试添加另一个字段时,会出现验证错误。

最好的方法是允许根据用户需要添加多个字段,然后填写并提交。

JSF:

<h:form id="myForm">
    <p:commandButton value="add" actionListener="#{testBean.addNewItem()}" update="@form"/>
    <p:commandButton value="done" update="@form,:p"/>
    <br/>
    <ui:repeat value="#{testBean.list}" var="l">
        <p:inputText value="#{l.name}" required="true"/>
        <br/>
    </ui:repeat>
</h:form>
<p:messages autoUpdate="true"/>
<p:panel id="p">
    #{testBean.list}
</p:panel>

支持bean没什么特别的。仅提供列表的getter和setter。它还将空字符串添加到列表中。

@ManagedBean
@ViewScoped
public class TestBean implements Serializable {
    private List<Item> list = new ArrayList<Item>();

    public List<Item> getList() { return list; }

    public void setList(List<Item> list) { this.list = list; }

    public void addNewItem() { list.add(new Item()); }
}

我可以:

  1. 删除字段要求 - 不是选项。
  2. 添加immediate="true"以添加按钮。验证现在不是问题,但它会导致填写但未提交的所有值都消失。我需要更新@form,因为只有ui:repeat才会呈现新添加的字段。
  3. 我尝试添加process="@this"添加按钮。不幸的是,这并没有改变一件事。不处理输入字段值,但需要更新表单。我没有提交上面提交的值。
  4. 我错过了什么?有没有解决方法?

2 个答案:

答案 0 :(得分:4)

只需让required属性检查是否按下了“完成”按钮。如果是这种情况,则按钮自己的客户端ID作为请求参数出现。请求参数可通过#{param}映射获得。您可以使用按钮的binding属性将物理组件绑定到视图,以便您可以在其他位置抓取UIComponent#getClientId()。最后只需做布尔逻辑。

E.g。

<p:commandButton binding="#{done}" ... />
...
<p:inputText ... required="#{not empty param[done.clientId]}" />

答案 1 :(得分:-1)

这样的事情会起作用吗?

<p:inputText value="#{l.name}" required="#{l.name != null ? true : false}"/>

这将不需要新添加的inputText组件,但强制执行列表中已有的项目。