对于Ajax请求,省略p:selectOneMenu的验证

时间:2015-04-24 12:52:10

标签: jsf jsf-2 primefaces

我有一个带有<p:selectOneMenu/>(Prime面)片段的Jsf页面和一个与之关联的Ajax。它有默认选择项“--- Select One ---”和其他动态创建的项目。

此字段是必填字段,因此如果用户提交的表单没有选择,则该页面会显示错误消息。

当我选择其中一个选项并再次选择“---选择一个---”时,会出现问题。然后页面显示所需的字段消息,甚至在我提交表单之前。我在immediate<p:ajax>标记中尝试<p:selectOneMenu>的不同方式,但它们都没有预期的行为。

<p:messages>声明如下:

- list.xhtml

<p:messages id="messages" autoUpdate="true" closable="true"  escape="false" />
<.... include fragment.xhtml ....>

片段:

- fragment.xhtml

<p:selectOneMenu id="selectTipoCarro"
                 value="#{carroBean.carro.tipoCarroEnum}"
                 required="true">
    <f:selectItems value="#{carroBean.listaSelectItemTipoCarroInclusao}" />
    <p:ajax update="outputInicioVigenciaWrapper outputLabelCalendarInicioVigenciaWrapper"
            listener="#{carroBean.aoMudarTipoCarro}" />
</p:selectOneMenu>

<h:panelGroup id="outputLabelCalendarInicioVigenciaWrapper">
    <h:outputLabel id="outputLabelCalendarInicioVigencia"
                   rendered="#{carroBean.edicaoDataInicioVigenciaDisponivel}"
                   for="calendarInicioVigencia">
        <span>*
            #{labels['carro.inicio.vigencia']}: </span>
        <p:calendar id="calendarInicioVigencia"
                    value="#{carroBean.carro.dataInicioVigencia}"
                    showOn="button"
                    pattern="dd/MM/yyyy" mask="true"
                    required="true"/>
    </h:outputLabel>
</h:panelGroup>

<h:panelGroup id="outputInicioVigenciaWrapper">
    <h:outputLabel for="outputInicioVigencia"
                   rendered="#{not carroBean.edicaoDataInicioVigenciaDisponivel}">
        <span aria-live="polite">
            <h:outputText id="outputInicioVigencia"
                          value="#{carroBean.carro.dataInicioVigencia}"
                          styleClass="dataFormat"
        </h:outputText>
    </span>
</h:outputLabel>
</h:panelGroup>
private SelectItem obterSelectItemSelecione() {
    SelectItem selectItem = new SelectItem("", "-- Select One --");
    return selectItem;
}

private void preencherListaSelectItemTipoCarro(List<SelectItem> select, TipoCarroEnum[] tiposCarrosConsiderados) {
    select.clear();
    select.add(obterSelectItemSelecione());
    for (TipoCarroEnum tipoCarro : tiposCarrosConsiderados) {
        select.add(new SelectItem(tipoCarro, tipoCarro.getNome()));
    }
}

public void aoMudarTipoCarro() {
    getCarro().setDataInicioVigencia(carroService.obterProximaDataInicioVigenciaDisponivel(getCarro().getTipoCarroEnum()));
}

2 个答案:

答案 0 :(得分:3)

预期的行为。向p:ajax添加p:selectOneMenu标记后,每次用户更改输入时都会处理该值,因此如果将其标记为required,则会对其进行验证和拒绝。我最喜欢的解决方法是在按钮中包含一个请求参数,以提交整个表单并在required属性中检查它。那就是它:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:comp="http://java.sun.com/jsf/composite/comp"
    xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head />
<h:body>
    <h:form>
        <p:messages autoUpdate="true" />
        <p:selectOneMenu value="#{val}"
            required="#{param['validate']}">
            <p:ajax event="change" />
            <f:selectItem itemLabel="None" noSelectionOption="true" />
            <f:selectItem itemLabel="val1" itemValue="val1" />
        </p:selectOneMenu>
        <p:commandButton value="Submit" ajax="false">
            <f:param name="validate" value="true" />
        </p:commandButton>
    </h:form>
</h:body>
</html>

另见:

答案 1 :(得分:2)

<强>解释

这是因为您有一个p:messages组件且autoUpdate设置为true,并且您已将p:ajax附加到selectOneMenu,因此只要您的值发生更改,p:messages就会更新。因此,由于使用required="true",一旦您选择了&#34; ---选择一个---&#34;就会显示错误消息。

<强>解决方案

  • ignoreAutoUpdate="true"添加到您的p:ajax
  • 如果没有必要,请删除autoUpdate="true"