我有一个带有<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()));
}
答案 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"