gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:47:46 26 4
gpt4 key购买 nike

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

此字段是必需的,因此如果用户在没有选择的情况下提交表单,页面会显示错误消息。

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

<p:messages>声明如下:

-- 列表.xhtml

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

片段:

-- 片段.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()));
}

最佳答案

这是预期的行为。将 p:ajax 标记添加到您的 p:selectOneMenu 时,您会在每次用户更改输入时处理该值,因此如果您标记它,它将被验证和拒绝作为要求。对于这种情况,我最喜欢的解决方法是在按钮中包含一个请求参数以提交整个表单并在 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>

另请参阅:

关于jsf - 省略对 Ajax 请求的 p :selectOneMenu, 的验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29848032/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com