2012-04-25 8 views
5

Ho un Textfield Wicket che contiene un valore interoCome posso verificare i valori nulli in un campo di testo Wicket?

currentValueTextField = new TextField<IntParameter>("valueText", new PropertyModel<IntParameter>(model, "value")); 

Sto attaccando un validatore personalizzato a questo, come segue

currentValueTextField.add(new IntegerValidator()); 

La classe di convalida è

class IntegerValidator extends AbstractValidator<IntParameter> { 

private static final long serialVersionUID = 5899174401360212883L; 

public IntegerValidator() { 
} 

@Override 
public void onValidate(IValidatable<IntParameter> validatable) { 
    ValidationError error = new ValidationError(); 
    if (model.getValue() == null) { 
     AttributeAppender redOutline = new AttributeAppender("style", new Model<String>("border-style:solid; border-color:#f86b5c; border-width: 3px"), ";"); 
     currentValueTextField.add(redOutline); 
     currentValueTextField.getParent().getParent().add(redOutline); 
     validatable.error(error); 
     } 
    } 
} 

Tuttavia se non digito nulla nel campo di testo, il mio metodo onValidate() non viene chiamato.

Qual è il modo consigliato per verificare valori null in questo caso? Mi piacerebbe anche fare il controllo del range sul valore inserito.

+0

Non so su Wicket ma in altri framework web che conosco la convalida non è chiamato per il vuoto campi di testo Alcuni forniscono ulteriori flag per i loro tag per abilitare/disabilitare i controlli richiesti, mentre in altri potrebbe essere necessario effettuare il controllo quando si inseriscono i valori del modulo nel modello (o controllare il modello successivamente). – Thomas

risposta

3

Ignora validateOnNullValue() ovvero false per impostazione predefinita.

@Override 
public boolean validateOnNullValue() 
{ 
    return true; 
} 

Questa è la descrizione del metodo validateOnNullValue():

indica se convalidare il valore se è null. Di solito è preferibile saltare la convalida se il valore è null, a meno che non vogliamo essere sicuri che il valore sia in realtà null (un caso d'uso raro). I validatori che estendono questo e desiderano assicurarsi che il valore sia null dovrebbe sostituire questo metodo e restituire true.

+0

L'override di validateOnNullValue() causa la chiamata del mio validatore, ma la cosa interessante è che il valore nel mio modello non è impostato su null.Quindi il mio codice di validazione non genera un errore perché pensa che il campo di testo abbia un valore non nullo. –

+0

Mmm ... Ma il 'null' deve essere qui' validatable.getValue() ', quando passi il validatore il valore non è ancora impostato sul modello. – jordeu

+0

Grazie! validatable.getValue() ha fatto il trucco. –

4

basta chiamare

currentValueTextField.setRequired(true); 

per contrassegnare il campo come richiesto e hanno Wicket gestire valori nulli su di essa la propria. È possibile combinare facilmente più validatori per campo di input.

Qualsiasi gestione di errore speciale, come l'aggiunta di bordi rossi o la visualizzazione di messaggi di errore può essere implementata nel metodo onError del modulo o aggiungendo FeedbackBorder s ai campi appropriati.

+0

Problema qui è che non ho alcun controllo su come viene indicato l'errore. Vorrei aggiungere un bordo rosso al campo di testo, ma wicket metterà un messaggio di errore in un pannello Feedback. Non voglio usare un pannello Feedback. –

+0

@AndrewFielden Questo può essere archiviato implementando onError() per il modulo. Ho esteso la mia risposta per coprire questo. – Nicktar

+0

Grazie. I ragazzi che hanno scritto Wicket hanno pensato a tutto. –

1

Un modo migliore (e riutilizzabile) per farlo è quello di eseguire l'override del metodo isEnabled(Component) del comportamento:

public class HomePage extends WebPage { 
    private Integer value; 
    public HomePage() { 
     add(new FeedbackPanel("feedback")); 
     add(new Form("form", new CompoundPropertyModel(this)) 
      .add(new TextField("value") 
       .setRequired(true) 
       .add(new ErrorDecorationBehavior())) 
      .add(new Button("submit") { 
       @Override 
       public void onSubmit() { 
        info(value.toString()); 
       } 
      })); 
    } 
} 

class ErrorDecorationBehavior extends AttributeAppender { 
    public ErrorDecorationBehavior() { 
     super("style", true, Model.of("border-style:solid; border-color:#f86b5c; border-width: 3px"), ","); 
    } 
    @Override 
    public boolean isEnabled(Component component) { 
     return super.isEnabled(component) && component.hasErrorMessage(); 
    } 
} 
2
currentValueTextField.setRequired(true); 

Ora è necessario personalizzare il messaggio di errore. Quindi sottoclasse FeedbackPanel.

è possibile trovare ulteriori informazioni nel seguente link

Aggiungere questa classe al form o il componente

Problemi correlati