2013-07-07 100 views
1

在我的xhtml頁面中,我有兩個依賴selectOneMenu,第二個填充ajax調用。下面是JSF的代碼片段:p:selectOneMenu值仍然需要

<h:panelGrid columns="2" cellpadding="5"> 
    <h:outputLabel value="Dirección:" for="direccion"/> 
     <p:inputText id="direccion" value="#{datosInstitucion.institucion.direccion}" required="true" label="Dirección"/> 
     <h:outputLabel value="Departamento:" for="departamento"/> 
     <p:selectOneMenu id="departamento" value="#{datosInstitucion.idDepartamento}" required="true" label="Departamento"> 
      <f:selectItem itemLabel="Seleccione el departamento" itemValue="#{null}"/> 
      <c:forEach items="#{datosInstitucion.departamentos}" var="departamento"> 
      <f:selectItem itemLabel="#{departamento.nombre}" itemValue="#{departamento.id}"/> 
      </c:forEach> 
      <f:ajax render="municipio" listener="#{datosInstitucion.cargarMunicipios()}"/> 
     </p:selectOneMenu> 
     <h:outputLabel value="Municipio:" for="municipio"/> 
     <p:selectOneMenu id="municipio" value="#{datosInstitucion.idMunicipio}"           required="true" label="Municipio"> 
      <f:selectItem itemLabel="Seleccione el municipio" itemValue="#{null}"/> 
      <c:forEach items="#{datosInstitucion.municipios}" var="municipio"> 
       <f:selectItem itemLabel="#{municipio.nombre}" itemValue="#{municipio.id}"/> 
      </c:forEach> 
     </p:selectOneMenu> 
    </h:panelGrid> 

該代碼片段是primefaces嚮導組件內,因此,當「下一個」按鈕被按下一個驗證錯誤被用於即使當有一個值組中的第二selectOneMenu用於引起。

什麼可能導致此行爲?

相關支持bean代碼:

@ManagedBean(name = "datosInstitucion") 
@ViewScoped 
public class DatosInstitucion implements Serializable{ 

    @EJB 
    private Instituciones instituciones; 

    @EJB 
    private Parametros parametros; 

    @Inject 
    private Mensajes mensajes; 

    private List<Departamento> departamentos; 
    private List<Municipio> municipios; 
    private Map<Integer, Departamento> mapaDepartamentos; 
    private Integer idDepartamento; 
    private Integer idMunicipio; 

    private Institucion institucion; 

    @PostConstruct 
    private void inicializar(){ 
     this.mapaDepartamentos = new HashMap<>(); 
     this.departamentos = parametros.consultarDepartamentos(); 
     for(Departamento departamento : departamentos){ 
      this.mapaDepartamentos.put(departamento.getId(), departamento); 
     } 
     this.prepararInstitucion(); 
    } 

    private void prepararInstitucion(){ 
     this.institucion = new Institucion(); 
     this.institucion.setResponsable(new Persona()); 
    } 

    public Institucion getInstitucion() { 
     return institucion; 
    } 

    public List<Departamento> getDepartamentos(){ 
     return departamentos; 
    } 

    public TipoIdentificacion[] getTiposIdentificacion(){ 
     return TipoIdentificacion.deResponsables(); 
    } 

    public Integer getIdDepartamento() { 
     return idDepartamento; 
    } 

    public void setIdDepartamento(Integer idDepartamento) { 
     this.idDepartamento = idDepartamento; 
    } 

    public Integer getIdMunicipio() { 
     return idMunicipio; 
    } 

    public void setIdMunicipio(Integer idMunicipio) { 
     this.idMunicipio = idMunicipio; 
    } 

    public void cargarMunicipios(){ 
     idMunicipio = null; 
     if(idDepartamento != null){ 
      this.municipios = mapaDepartamentos.get(idDepartamento).getMunicipios(); 
     }else{ 
      this.municipios = Collections.emptyList(); 
     } 
    } 

    public List<Municipio> getMunicipios() { 
     return municipios; 
    } 

    public void confirmar(){ 
     this.instituciones.guardar(institucion); 
     this.mensajes.exito("La institución ha sido registrada en el sistema"); 
     this.prepararInstitucion(); 
    } 
} 
+1

使用''而不是JSTL'' – fareed

+0

@ ed Yes是的,將替換爲解決了問題。謝謝! – fturizo

+0

歡迎您:) – fareed

回答

1

這是因爲你使用JSTL <c:foreach>與JSF。 JSTL與JSF的生命週期很重要。 JSTL在構建視圖時執行,而JSF在視圖呈現時執行。兩者不能相互同步。在你的情況,你需要使用<f:selectItems>代替<c:foreach>

替換:

<c:forEach items="#{datosInstitucion.municipios}" var="municipio"> 
     <f:selectItem itemLabel="#{municipio.nombre}" itemValue="#{municipio.id}"/> 
</c:forEach> 

有:

<f:selectItems value="#{datosInstitucion.municipios}" 
    var="municipio" itemLabel="#{municipio.nombre}" 
    itemValue="#{municipio.id}"/> 

更多的閱讀,我建議你閱讀以下answer

相關問題