2012-06-28 14 views
7

Ich versuche eine Umleitung von index.xhtml zu registerFirstTime.xhtml zu machen.Wie kann eine Befehlsschaltfläche aufgerufen werden, ohne alle erforderlichen Eingaben zu überprüfen?

Der Code auf der Seite index.xhtml ist:

<h:form id="content" style="margin-top: 1em;"> 
    <p:panel id="panel" header="LOGIN"> 
     <p:messages id="msgs" globalOnly="true"/> 
     <h:panelGrid columns="3"> 
      <h:outputLabel value="e-mail" /> 
      <p:inputText id="name" required="true" value="#{UserBean.email}" 
       requiredMessage="Required: e-mail" display="icon"> 
      </p:inputText> 
      <p:message id="msgName" for="name"/> 
      <h:outputLabel value="Password" /> 
      <p:password id="password" required="true" value="#{UserBean.password}" 
       requiredMessage="Required: Password" display="icon" feedback="false"> 
      </p:password> 
      <p:message id="msgPassword" for="password"/> 
     </h:panelGrid> 
     <h:panelGrid columns="2"> 
      <p:commandButton value="Login" actionListener="#{UserBean.validate}" update="msgNombre, msgPassword, msgs"/> 
      <h:commandButton value="Register for the first time" action="register"/> 
     </h:panelGrid> 
    </p:panel> 
</h:form> 

Während der Inhalt der Umleitung in faces-config.xml ist:

<navigation-rule> 
    <from-view-id>index.xhtml</from-view-id> 
    <navigation-case> 
     <from-outcome>register</from-outcome> 
     <to-view-id>registerFirstTime.xhtml</to-view-id> 
    </navigation-case> 
</navigation-rule> 

Bis zum Eingangsnamen und Passwort sind gefüllt, Sie können die Umleitung nicht tun. Wie kann ich die Umleitung des Datensatzes tun, ohne die erforderlichen Felder zu berücksichtigen? Vielen Dank! =)

+0

Meinten Sie Redirect beim Senden ohne Füllwerte ?? – NaaN

+0

Ja, ich muss einen Füllwert umleiten (login), aber ich brauche auch eine andere Umleitung (Register) ohne Füllwerte. –

+0

Ich habe bewiesen, dass die h: commandButton in eine andere h: form, und es funktioniert, aber ist es möglich, die h: commandButton in der h: form mit id content? –

Antwort

26

Fügen Sie immediate="true" zu der Befehlsschaltfläche hinzu, die die Verarbeitung aller Eingabefelder überspringen soll, die das immediate="true" Attribut nicht aufweisen.

<h:commandButton value="Register for the first time" action="register" immediate="true" /> 

Unrelated auf das konkrete Problem, bitte beachten Sie, dass Sie hier technisch nicht eine Umleitung zu senden. Dies sendet im Grunde eine Weiterleitung, d.h. die URL in der Adressleiste des Browsers bleibt die URL der Anmeldeseite. Sie müssen <redirect/> zu <navigation-case> hinzufügen. Beachten Sie auch, dass Navigationsfälle ein Überbleibsel von JSF 1.x sind. Seit JSF 2.x können Sie "implizite Navigation" durchführen, wobei Sie nur die Ansichts-ID als Ergebnis angeben.

<h:commandButton value="Register for the first time" action="registerFirstTime?faces-redirect=true" immediate="true" /> 

Auf diese Weise können Sie den Navigationsfall insgesamt loswerden.

6

@BalusC Lösung sollte den Trick tun, wie immer. Aber ich möchte auf einige Dinge hinweisen, da Sie anscheinend Primefaces verwenden. Beide haben nichts mit der Frage zu tun, könnten Ihnen aber irgendwann helfen.

Zuerst könnten Sie die implizite Navigation verwenden (eingeführt in JSF2). Auf diese Weise müssten Sie nicht alle Navigationsregeln in Ihrer faces-config.xml-Datei definieren (ich arbeite an einem alten JSF 1.2-Projekt und hasse es, die Navigationsrollen für alles zu definieren). Hier ist, wie Sie es tun würde:

<h:commandButton value="Register for the first time" action="registerFirstTime.xhtml?faces-redirect=true"/>

Die Gesichter-redirect Parameter erzwingt eine Umleitung anstelle eines nach vorn, falls Sie das brauchen.

Auch sagen Sie, dass Sie einige Werte richtig verarbeiten möchten, aber nicht alle von ihnen. In diesem Fall können Sie das -Prozess-Attribut von p: commandButton oder p: ajax verwenden. Zum Beispiel

<h:commandButton value="Register for the first time" action="registerFirstTime.xhtml?faces-redirect=true" process="@this, name"/>

Dies würde JSF Prozess machen nur die Taste (@this) und die Komponente mit id = "name" (Ihre E-Mail-Feld). Auch dies gilt wahrscheinlich nicht für diese Frage, aber es ist etwas, was ich oft verwende.