2011-05-30 33 views
5

Tengo un p:wizard con algunas pestañas. En la primera pestaña, el usuario selecciona un valor (t :selectOneRadio - Estoy usando Tomahawk). Ese es un valor requerido.PrimeFaces 'p: la validación del asistente no funciona

Si el usuario no selecciona un valor, no irá a la siguiente pestaña, pero no se mostrará ningún error de validación. Hm.

Si el usuario ha elegido un valor, va a la siguiente pestaña, vuelve a la primera pestaña y elige un valor diferente, esta vez se comportará como si no se hubiera elegido ningún valor. (Sin error de validación, pero la segunda pestaña no se puede invocar).

Y lo que es peor: el usuario elige un valor en la primera pestaña, va a la segunda pestaña, intenta invocar una acción desde allí ... aparece un mensaje de validación; actúa como si no se eligiera ningún valor en la primera pestaña.

¿Hay alguna explicación para esto?

ACTUALIZACIÓN

La solución suggested en los foros PrimeFaces trabajado para mí. (Agregando process = "@ this" al commandButton.)

Respuesta

4

ACTUALIZACIÓN

La solución suggested en los foros PrimeFaces trabajado para mí. (Agregando process="@this" al commandButton.) No tengo idea por qué, though!

2

Parece que podría ser uno de los posibles problemas. Es posible que esté obteniendo un error de validación, sin embargo, es posible que no haya declarado su componente de mensajes correctamente o que no esté actualizando. Si este es el caso, pueden ser errores de validación que simplemente no ve representados en la página.

de la guía Primefaces 2,2 para el componente Wizard:

AJAX y validaciones parciales - conmutación entre los pasos se basa en ajax, es decir, cada paso se carga dinámicamente con ajax. La validación parcial también está incorporada, de esta manera, al hacer clic en siguiente, solo se valida el paso actual, si el paso actual es válido, los contenidos de la siguiente pestaña se cargan con ajax. Las validaciones no se ejecutan cuando retrocede el flujo.

El otro problema puede ser que su propiedad no se está configurando correctamente en el bean administrado y esto está causando problemas de validación. Esto parece más probable.

¿Tengo problemas para pensar por qué uno necesitaría validación aparte de 'Requerido' para un selectOneRadio? Usted tiene un número limitado de opciones y una debe ser seleccionada, por lo tanto, un valor incorrecto o no válido no debería ser posible.

+0

¡Gracias por tomarse el tiempo! "required" es la única validación que tengo para eso selectOneRadio. Pero el asistente parece "olvidar" el valor después de llamar a la siguiente pestaña. Esto parece un problema común: http://stackoverflow.com/questions/3854439/primefaces-wizard-component-resets-values-in-hselect-components-when-form-i – geeehhdaa

+0

Eso es ... ¡extraño! Utilizo un asistente p: en mi aplicación y no tengo este problema en absoluto. Además, no veo lo que estás haciendo mal. ¿Qué versión de Primefaces y Mojarra estás usando actualmente? –

+0

Estoy usando PrimeFaces 2.2.1 y no uso Mojarra, utilizo MyFaces. Además de eso, PrimeFaces está funcionando bien para mí. He leído una solución alternativa en algún lugar del foro de PrimeFaces (no puedo encontrar el enlace ahora mismo) que decía: usar un inputHidden en las siguientes pestañas funcionaría para preservar el valor. Sin embargo, no funcionará para mí. – geeehhdaa

3

Otra cosa que puede que desee considerar ..

Si está teniendo problemas con los campos requeridos por las fichas, puede realizar manualmente sus propias validaciones entre los pasos mediante la implementación de un evento de flujo en el componente de asistente.

public String onFlowProcess(FlowEvent event) { 
    //First perform check to see if the user is attempting to remove the last visitor 
    if ("confirm".equals(event.getNewStep()) && (visitors == null || visitors.isEmpty())) { 
     log.debug("Validation failed for empty visitors"); 
     FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Visit must have at least one visitor.", null); 
     FacesContext.getCurrentInstance().addMessage(null, msg); 
     return event.getOldStep(); 
    } 

    return event.getNewStep(); 
} 

Y el archivo .xhtml declaro el evento flowListener. Pruebe esto y vea si los mensajes de validación desaparecen.

<p:wizard showNavBar="true" widgetVar="scheduler" flowListener="#{scheduleVisit.onFlowProcess}" showStepStatus="true"> 
+0

El valor siempre estuvo presente utilizando esta técnica. Creo que lo he arreglado. Encontré esto: http://primefaces.prime.com.tr/forum/viewtopic.php?f=3&t=1724&start=0 Agregué process = "@ this" al CommandButton y funciona. No tengo idea * por qué *, sin embargo. Y espero que no tenga efectos secundarios. Hm. Muchas gracias por ayudarme, maple_shift! – geeehhdaa

+0

¡Bien!Por favor, publique su solución como una respuesta, por favor, para el beneficio de las personas que buscan este problema en el futuro. –

+1

Enlace del foro cambiado: http://forum.primefaces.org/viewtopic.php?f=3&t=1724 –

1

Solo necesita poner el atributo requerido verdadero en su botón de opción.

ejemplo:

<p:selectOneRadio required="true" requiredMessage="you must put it"> 
    <f:selectItem itemLabel="Días Laborales" itemValue="diasLab" /> 
    <f:selectItem itemLabel="Días Ticados" itemValue="diasTic" /> 
</p:selectOneRadio> 
p
-1

PrimeFaces': asistente problema de validación

Paso: 1 customerInformation.xhtml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:p="http://primefaces.org/ui"> 


<p:wizard flowListener="#{customerForm.onFlowProcess}"> 

     <p:tab id="information" title="Information"> 
    <p:panel header="Customer Information"> 

     <h:outputLabel value="First Name" for="fName"/> 
      <h:inputText id="fname" value="#{customer.fname}"/>                                    

      <h:outputLabel value="Last Name" for="lName"/> 
      <h:inputText id="lname" value="#{customer.lname}"/>                

     </panel> 
     </p:tab> 

     <p:tab id="details" title="Details"> 
     <p:panel header="Customer Details"> 

       <h:outputLabel value="Address Line 1" for="addressOne"/> 
      <h:inputText id="addressOne" value="#{customer.addressOne}"/>                                    

      <h:outputLabel value="Address Line 2" for="addressTwo"/> 
      <h:inputText id="addressTwo" value="#{customer.addressTwo}"/> 

      </panel> 
     </p:tab> 
    </p:wizard> 
</html> 

Paso: CustomerForm.java 2 Crear clase de bean

public class CustomerForm implements Serializable { 

    private static final long serialVersionUID = 1L; 

    private String fName; 
    private String lName; 
    private String addressOne; 
    private String addressTwo; 

    private static Logger logger = Logger.getLogger(CustomerForm.class.getName());           

    /** 
    * Call this method in p:wizard tag 
    * 
    */ 
    public String onFlowProcess(FlowEvent event) { 
    logger.info("Current wizard step:" + event.getOldStep()); 
    logger.info("Next step:" + event.getNewStep()); 
     return event.getNewStep(); 
    } 

    /** 
    * @return the fName 
    */ 
    public String getfName() { 
     return fName; 
    } 
    /** 
    * @param fName the fName to set 
    */ 
    public void setfName(String fName) { 
     this.fName = fName; 
    } 
    /** 
    * @return the lName 
    */ 
    public String getlName() { 
     return lName; 
    } 
    /** 
    * @param lName the lName to set 
    */ 
    public void setlName(String lName) { 
     this.lName = lName; 
    } 
    /** 
    * @return the addressOne 
    */ 
    public String getAddressOne() { 
     return addressOne; 
    } 
    /** 
    * @param addressOne the addressOne to set 
    */ 
    public void setAddressOne(String addressOne) { 
     this.addressOne = addressOne; 
    } 
    /** 
    * @return the addressTwo 
    */ 
    public String getAddressTwo() { 
     return addressTwo; 
    } 
    /** 
    * @param addressTwo the addressTwo to set 
    */ 
    public void setAddressTwo(String addressTwo) { 
     this.addressTwo = addressTwo; 
    } 

} 

Nota: no coloque required = "true" en el archivo xhtml

Cuestiones relacionadas