【问题标题】:At least one/group of multiple fields required in JSFJSF 中至少需要一个/一组多个字段
【发布时间】:2017-08-23 16:59:46
【问题描述】:

我正在尝试执行一个搜索功能,其中我有多个字段,并且至少需要其中一个或一组。

我在 StackOverflow 上找到的唯一答案是这个:How to validate if at least one of multiple input fields is entered?

那里有两种解决方案:一种使用Omnifaces(由于项目要求我不能使用),另一种不优雅,因为当字段数量很大时它会增长很多。

例如,我有这些字段:

                <p:selectOneMenu value="#{backingBean.type}"id="type">
                    <f:selectItem itemLabel="#{constantsController.SELECT_TYPE_HEADER}"
                        itemDisabled="true" />
                    <f:selectItems
                        value="#{constantsController.getTypes().entrySet()}"
                        var="entry" itemValue="#{entry.key}" itemLabel="#{entry.value}" />
                </p:selectOneMenu>

                <p:inputText id="number" value="#{backingBean.number}"/>

                <p:inputText id="year" value="#{backingBean.year}"/>

                <p:inputText id="number2" value="#{backingBean.number2 }"/>

                <p:selectOneMenu value="#{backingBean.state}"
                    id="state" filter="true" filterMatchMode="startsWith">
                    <f:selectItem itemLabel="Choose its state" disabled="true" />
                    <f:selectItems value="#{constantsController.getStates().entrySet()}"
                        var="entry" itemValue="#{entry.key}" itemLabel="#{entry.value}" />
                </p:selectOneMenu>

                <p:selectOneMenu id="entity"
                    value="#{backingBean.entity }">
                    <f:selectItem itemLabel="Select entity"
                        itemDisabled="true" />
                    <f:selectItem itemLabel="Entity1" itemValue="1"></f:selectItem>
                    <f:selectItem itemLabel="Entity2" itemValue="2"></f:selectItem>
                </p:selectOneMenu>

                <p:selectOneMenu id="documentType"
                    value="#{backingBean.documentType}">
                    <f:selectItems
                        value="#{constantsController.getDocumentTypes().entrySet()}"
                        var="entry" itemValue="#{entry.key}" itemLabel="#{entry.value}" />
                </p:selectOneMenu>
                <p:inputText id="documentNumber" value="#{backingBean.documentNumber}"/>

如您所见,我有多个字段。并且要求规定我需要以下要求之一(我会写 id's):

1-类型+数字+年份

2- number2 + 状态

3-实体

4- 文档类型 + 文档编号

所以当我单击命令按钮时,我需要它来检查这些组(1、2、3 或 4)中的一个是否已填充。

另外,groups本身也是需要的,比如我已经填了entity,也填了year,不能让我前进,因为year需要伴随着type和'号”。

【问题讨论】:

  • 您可以在 Java(服务器端)中检查所需的字段/组,而不是在客户端
  • 是的,这就是我最后的解决方案。感谢您的帮助。

标签: validation jsf


【解决方案1】:

我通过将支持 bean 中的布尔值与每个字段/字段组相关联来解决它。这不是一个优雅的解决方案,但我没有找到任何其他解决方案。

所以我所做的是通过支持 bean 中的一组字段定义一个用 true 值初始化的布尔值:

private boolean typeNumberYear = true;
private boolean number2State = true;
private boolean entityRequired = true;
private boolean documentTypeDocumentName = true;
private boolean masterRequired = true;

然后验证它们:

public void checkRequiredFields(){

    if(!type.equals("") && number != 0 && year != 0)
        typeNumberYear = false;
    if(number2 != 0 && !state.equals(""))
        number2State = false;
    if(!entity.equals(""))
        entityRequired= false;
    if(!documentType.equals("") && documentNumber != 0)
        documentTypeDocumentName = false;

    if(!typeNumberYear || !number2State || !entityRequired || !documentTypeName)
        masterRequired = false;
}

由于这一切都在backing bean中,我可以把这个函数放在命令按钮的actionListener上,而action函数仍在控制器中。

<p:commandButton value="Search" icon="ui-icon-search"
                actionListener="#{backingBean.checkRequiredFields}"
                action="#{controller.searchButtonClicked}"/>

现在在required 参数中,我只是将各自的布尔值和所有它们的masterRequired 关联起来。例如。在typenumberyear 输入中,我将所需的内容如下:

required = "backingBean.typeNumberYear and backingBean.masterRequired"

此解决方案的唯一缺点是,在界面中,上面指示的所有字段上都会出现一个星号,但是如果您只是输入实体,例如,它将按预期进行搜索,然后它会更新并删除星号。

【讨论】:

    猜你喜欢
    • 2011-07-21
    • 2016-06-29
    • 2015-08-12
    • 2014-06-17
    • 2013-01-05
    • 2018-10-06
    • 1970-01-01
    • 2020-03-08
    相关资源
    最近更新 更多