2010-08-24 5 views
6

Ich werde versuchen, so kurz wie möglich zu sein, mit mir bitteGibt es eine Möglichkeit, beim Klicken auf eine Schaltfläche kein ganzes Webformular zu senden?

"A.jsf" hier bleiben -> Managed Bean: Bohne "# {bean.list}": uns nehmen

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> 

Dann wird der 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" -> Managed Bean: Bean2

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

Wenn ich auf Upload klicke, bekomme ich eine Growl-Fehlermeldung "Du hast keine Berechtigung zum Hochladen.", Was gut ist. Aber wenn ich dann auf "Zurück" klicke, was mich zu B.jsf bringt, sehe ich die Growl-Meldung "Du hast keine Berechtigung zum Hochladen". nochmal. Was scheinbar passiert ist, als ich auf "Zurück" klicke, sende ich eine andere Formularanfrage zum Hochladen, die dann die gleiche Fehlermeldung erzeugt, die dann bei B.jsf angezeigt wird. Gibt es eine Möglichkeit, das zu beheben, indem ich den "Zurück" -Knopf in eine leere Form setze, weil ich jetzt zwei Knöpfe übereinander statt nebeneinander habe. Ich versuche, dies zu tun:

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

die Hoffnung, dass es mit id = „tom“, so dann dem Knurren mit id = msgs Komponente senden würde, würde Last nicht bekommen, aber kein Glück. Ich versuche, das upload Flag zu aktivieren, wenn ich auf die Schaltfläche Back klicke, aber das Webformular wird angefordert, bevor die Methode, die die back Navigation behandelt, aufgerufen wird.

Es ist nicht so kurz, wie ich es möchte daher dafür entschuldige ich mich wollen: D

Antwort

5

neben der Schaltfläche „Zurück“ in eine leere Form gebracht werden, jetzt, da ich zwei Tasten haben, die auf der jeweils anderen

Die HTML <form> ist standardmäßig ein block element. HTML-Blockelemente werden standardmäßig in einer neuen Zeile platziert. Sie möchten es tatsächlich zu einem inline element machen. Sie können dies unter Verwendung von display: inline; in CSS tun.

Zurück zu dem eigentlichen Problem, es überrascht mich jedoch, dass die fileUploadListener Methode trotz der immediate="true" in der p:commandButton genannt wird. Ich habe versucht, dies zu reproduzieren und ich kann das bestätigen. Aber ich würde nicht erwarten, dass es passiert.Normalerweise die immediate="true" auf eine Schaltfläche ist die Lösung zu überspringen Einreichung der "ganzen" Formular (mindestens überspringen Sie die UIInput Komponenten ohne dieses Attribut). Weitere Untersuchungen haben mich gelehrt, dass die p:fileUpload überhaupt keine UIInput Komponente ist und dass der Listener während der Phase der Anforderungswerte statt der Validierungen oder der Aktualisierung der Modellwertephase ausgelöst wird. Dieses Verhalten ist also vollständig vorhersagbar, aber ich habe immer noch ein Versehen im Design.

Seit den p:fileUploadajax="false" auf der p:commandButton Komponente erfordert, können Sie auf der anderen Seite können auch nur aus der Zurück-Taste entfernen, so dass sie eine ajaxical Anfrage feuern und hiermit überspringen die fileUploadListener aufgerufen wird.

+0

Das Herausnehmen von 'ajax =" false "' auf dem 'p: commandButton' der' Back'-Schaltfläche verhindert, dass 'fileUploadListener' aufgerufen wird, verhindert aber auch' navigation flow'. Als Ergebnis, "Zurück" -Button nehmen Sie mich nicht, wo jedoch "Display: Inline" funktioniert super, vielen Dank für die Zeit, BalusC –

+0

Gern geschehen. – BalusC

2

Eigentlich die Schaltfläche in eine andere Form gebracht klingt wie eine ausgezeichnete Lösung. Der Grund dafür, dass die Schaltflächen nicht mehr ausgerichtet sind, besteht darin, dass das neue Startelement <form> auf einer eigenen Zeile beginnt. Sie sollten dies verhindern können, indem Sie Ihrer CSS-Datei form { display: inline; } hinzufügen.

Das heißt, wenn Sie einige übrig gebliebenen Fehlermeldungen haben, die Sie loswerden wollen, können Sie dies in der Initialisierungsmethode Ihrer Backing-Bean tun (falls Sie eine haben). Die folgenden Werke 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(); 
    } 
} 

Der Nachteil hierbei ist, dass alle Fehler, die zwischen Absenden des Formulars und der Initialisierung des Backing Bean der Zielseite auftreten, werden auch geschluckt.

+0

danke. Ich versuche dies ' Übermitteln Button Zurück Button', Ich habe immer noch zwei, die übereinander stehen. Die Methode 'clearErrorMessages()', die Sie in die Initialisierungsmethode der Ziel-Managed-Bean geschrieben haben, und meine Ziel-Managed-Bean haben 'SessionScoped', so dass der Konstruktor nur einmal beim ersten Laden der Anwendung aufgerufen wird, außer es gibt einige Art der Anmerkungen, die beim erneuten Laden der Seite erkannt werden. –