2010-08-24 21 views
6

Voy a tratar de ser lo más breve posible, por favor, quédate conmigo aquí¿Hay alguna manera de no enviar un formulario web completo al hacer clic en un botón?

"A.jsf" -> bean administrado: frijol "# {} bean.list": nos llevará a B.jsf

 <p:growl id="msgs" showDetail="true"/> 
     <h:form id="myform1" enctype="multipart/form-data"> 
      <p:panel header="Upload" style="font-size: 11px;"> 
       <h:panelGrid columns="2" cellpadding="10"> 
        <h:outputLabel value="Drawing:" /> 
        <p:fileUpload fileUploadListener="#{bean.handleFileUpload}" update="msgs" allowTypes="*.*;"/>       
       </h:panelGrid> 
       <p:commandButton ajax="false" immediate="true" id="back" value="Back" action="#{bean.list}"/> 
       <p:commandButton ajax="false" id="persist" value="Persist" action="#{bean.handleRevision}" /> 
      </p:panel> 
     </h:form> 

Entonces el handleFileUpload()

 if(!upload){ 
      FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "You do not have permission to upload."); 
      FacesContext.getCurrentInstance().addMessage(null, msg); 
     } 
     ... 

"B.jsf" - bean> gestionan: Bean2

... 
<p:growl id="msgs" showDetail="true"/> 
... 

Cuando hago clic en cargar, me da un mensaje de error gruñido "No tienes permiso para subir", lo cual es bueno. Pero cuando hago clic en "Atrás", que me llevará a B.jsf, veo el mensaje "No tienes permiso para subir". de nuevo. Lo que parece estar sucediendo es que al hacer clic en "Atrás", envío otra solicitud de formulario para cargar, que luego generó el mismo mensaje de error, que luego se muestra en B.jsf. ¿Hay alguna manera de arreglar esto, además de poner el botón "Atrás" en una forma vacía, porque ahora tengo dos botones de pie uno encima del otro, en lugar de uno al lado del otro. Trato de hacer esto:

FacesContext.getCurrentInstance().addMessage("tom", msg); 

con la esperanza de que enviaría al componente con id = "Tom", por lo que entonces el gruñido con id = msgs, no llegaría carga, pero no hubo suerte. Intento girar el indicador upload cuando hago clic en el botón Back, pero se solicita el formulario web antes de que se llame al método que maneja la navegación back.

No es tan breve como yo quiero que sea, por lo tanto, quiero pedir disculpas por ello: D

Respuesta

5

lado de poner el botón "Atrás" en una forma vacía, porque ahora tengo dos botones que se colocan encima de los demás

El HTML <form> es por defecto un block element. Los elementos de bloque HTML se colocan por defecto en una nueva línea. De hecho, desea convertirlo en inline element. Puede hacerlo usando display: inline; en CSS.

Volviendo al problema real, sin embargo me sorprende que se llame al método fileUploadListener a pesar del immediate="true" en el p:commandButton. Traté de reproducir esto y puedo confirmar esto. Pero no esperaría que sucediera.Normalmenteimmediate="true" en un botón es la solución para omitir la presentación del formulario "completo" (al menos, omita los componentes UIInput sin este atributo). La investigación adicional me enseñó que el p:fileUpload no es un componente UIInput en absoluto y que el oyente se activa durante la fase de solicitud de valores de solicitud en lugar de las validaciones o actualiza la fase de valores del modelo. Entonces, este comportamiento es totalmente predecible, pero todavía es un descuido en el diseño.

Desde el p:fileUpload requiere ajax="false" en el componente p:commandButton, puede, por otro lado también acaba de quitarlo de en el botón Atrás forma que se dispare una solicitud ajaxical y por este medio se salta el fileUploadListener ser llamado.

+0

Sacar 'ajax =" false "' en 'p: commandButton' del botón' Atrás' evita que se llame a 'fileUploadListener', sin embargo, también previene' navigation flow'. Como resultado, el botón 'Atrás' no me lleva a ningún lado, sin embargo,' display: inline' funciona muy bien, muchas gracias por pasar tiempo, BalusC –

+0

De nada. – BalusC

2

En realidad, poner el botón en una forma diferente suena como una excelente solución. La razón por la que los botones ya no se alinean es que el nuevo elemento de inicio <form> comienza en su propia línea. Debería poder evitar esto agregando form { display: inline; } a su archivo CSS.

Dicho esto, si usted tiene algunos mensajes de error sobrantes que desea quitarse de encima, se puede hacer esto en el método de inicialización de su bean de respaldo (si lo tiene). Las siguientes obras: peachily

public void clearErrorMessages() { 
    //it may get messy to debug why messages are swallowed 
    logger.debug("clearing messages, coming from " + new Exception().getStackTrace()[1]); 

    Iterator iter = FacesContext.getCurrentInstance().getMessages(); 
    while (iter.hasNext()) { 
     FacesMessage msg = (FacesMessage) iter.next(); 
     logger.debug("clearing message: " + msg.getDetail()); 
     iter.remove(); 
    } 
} 

La desventaja aquí es que los errores que se producen entre la presentación de la forma y la inicialización del bean de respaldo de la página de destino también se tragan.

+0

gracias. Intento esto ' Botón Enviar Botón Atrás', todavía tengo dos uno encima del otro. El método 'clearErrorMessages()', dijiste ponerlo en el método de inicialización del bean objetivo administrado, así mi bean objetivo administrado tiene 'SessionScoped', por lo que el constructor se llamará solo una vez cuando la aplicación se cargue por primera vez, a menos que haya alguna tipo de anotaciones para detectar cuándo se vuelve a cargar la página. –

Cuestiones relacionadas