2010-12-08 13 views
1

Ich habe ein Formular in JSF2 mit 2 Checkboxen (<h:selectBooleanCheckbox>). Mindestens einer von ihnen sollte überprüft werden. Beide Überprüfungen sind auch in Ordnung, aber wenn keine überprüft wird, sollte ein Fehler auftreten.JSF2: Wie validiere ich zwei abhängige Checkboxen?

Diese Validierung sollte auch auf AJAX funktionieren, d. H. Wenn Benutzer ein-/auscheckt, sollte die Fehlermeldung verschwinden/erscheinen.

Also bin ich beide Kontrollkästchen an UISelectBoolean Elemente gebunden und hinzugefügt Validator zu jedem. Im Validator prüfe ich den Wert des zweiten Kontrollkästchens, wenn es falsch ist und das aktuelle Kontrollkästchen ebenfalls auf "false" gesetzt ist, wird eine Fehlermeldung generiert. Smth mag:

if (newValue == false && secondCheckbox.getValue() == false) { 
    throw new ValidationException(); 
} 

Problem ist, wenn der Benutzer Checkbox auf der Seite unchecks, während die anderen auch nicht markiert ist, dieser falsche Wert geht nicht auf das Modell, noch Ereignis UISelectBoolean.

Szenario:

  1. zunächst beide sind nicht markiert
  2. Benutzer prüft checkbox1.
  3. newValue ist true, so ist dies gültig, geht zu UISelectBoolean und Modell.
  4. Benutzer deaktiviert checkbox1. Checkbox2 ist false, newValue ist false, so dass eine Ausnahme ausgelöst wird. Aufgrund der fehlgeschlagenen Validierung wird dieser false-Wert nicht an das Modell und nicht einmal an das UISelectBoolean-Element übergeben.
  5. Benutzer überprüft checkbox2. True Wert geht an das Modell und UISelectBoolean.
  6. Benutzer deaktiviert checkbox2. Checkbox1 ist auf der Seite noch nicht markiert, aber im Modell und UISelectBoolean ist immer noch true. Die Validierung ist also erfolgreich und es liegt keine Fehlermeldung vor. Auf der Seite sind beide Kontrollkästchen deaktiviert, aber im Modell checkbox1 ist immer noch true.

Wie löst man ein solches Problem?

+0

Jeder Grund, warum Sie '' nicht verwenden können? – BalusC

+0

Ja, wusste es nicht :) Danke! – amorfis

+0

Kann ich zu hinzufügen? Sieht aus wie f: Ajax funktioniert nicht. – amorfis

Antwort

1

Betrachten Sie <h:selectManyCheckbox required="true">. Hier ist ein Kick-off Beispiel:

<h:form> 
    <h:selectManyCheckbox id="options" value="#{bean.checked}" required="true"> 
     <f:selectItems value="#{bean.options}" /> 
     <f:ajax render="optionsMessage" /> 
    </h:selectManyCheckbox> 
    <h:message id="optionsMessage" for="options" /> 

    <h:commandButton value="Submit" action="#{bean.submit}"> 
     <f:ajax execute="@form" render="@form" /> 
    </h:commandButton> 
    <h:messages globalOnly="true" /> 
</h:form> 

Mit

@ManagedBean 
@RequestScoped 
public class Bean { 

    private List<String> checked; 
    private List<String> options = Arrays.asList("first", "second"); 

    public void submit() { 
     System.out.println("Checked: " + checked); 
    } 

    // ... 
} 

Die f:ajax funktioniert hier gut. Wahrscheinlich haben Sie event="click" anstelle von (der Standard) event="valueChange" verwendet, was dazu führen wird, dass das Häkchen nach dem Rendern nicht beibehalten wird. Die click heißt nämlich direkt bevor das Häkchen optisch gesetzt wird. Der Rendervorgang würde das visuelle Setzen des Häkchens blockieren.

+0

Danke @BalusC!:) Das einzige Problem, das ich damit habe, ist, dass eine

erstellt wird, die ich innerhalb einer anderen Tabelle habe. Als alles, was ich nach diesem -Element eingefügt habe, wird unter der Checkbox-Tabelle angezeigt. Gibt es eine Möglichkeit, es "nach" Tabelle anzuzeigen? Ich meine auf der gleichen Ebene, rechts neben der Checkbox-Tabelle. – amorfis

+1

Verwenden Sie CSS, um es auf 'display: inline;' oder 'float: left;' zu setzen. Tomahawks '' kann ebenfalls hilfreich sein. Sie können [''] (http://myfaces.apache.org/tomahawk-project/tomahawk20/tagdoc/t_checkbox.html) überall positionieren, wo Sie möchten. Also, volle Kontrolle über Markup. – BalusC