2012-04-25 14 views
5

que tienen un campo de texto peatonal incorporada que contiene un valor entero¿Cómo verifico los valores nulos en un Wicket Textfield?

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

Estoy adjuntando un validador personalizado a este, de la siguiente manera

currentValueTextField.add(new IntegerValidator()); 

La clase validador es

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); 
     } 
    } 
} 

Sin embargo si no escribo nada en el campo de texto, no se está llamando a mi método onValidate().

¿Cuál es la forma recomendada de verificar valores nulos en este caso? También me gustaría hacer un control de rango en el valor ingresado.

+0

No sé sobre Wicket pero en otros frameworks web, que yo sepa la validación no se llama de vacío campos de texto. Algunos proporcionan indicadores adicionales para sus etiquetas para habilitar/deshabilitar las comprobaciones requeridas, mientras que en otros es posible que tenga que hacer el control al poner los valores del formulario en el modelo (o verificar el modelo después). – Thomas

Respuesta

3

Override validateOnNullValue() que es false de forma predeterminada.

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

Esta es la descripción de validateOnNullValue() método:

Indica si validar o no el valor si es null. Por lo general, es deseable omitir la validación si el valor es null, a menos que deseemos asegurarnos de que el valor es, de hecho, null (un caso de uso raro). Los validadores que extienden esto y desean asegurarse de que el valor sea null debe anular este método y devolver true.

+0

Reemplazar validateOnNullValue() hace que se llame a mi validador, pero lo interesante es que el valor en mi modelo no está establecido en nulo.Entonces, mi código de validador no generará un error porque cree que el campo de texto tiene un valor no nulo. –

+0

Mmm ... Pero el 'nulo' tiene que estar aquí' validatable.getValue() ', cuando pase arroje el validador, el valor aún no está establecido en el modelo. – jordeu

+0

¡Gracias! validatable.getValue() hizo el truco. –

4

sólo llamar

currentValueTextField.setRequired(true); 

para marcar el campo según sea necesario y tienen Wicket manejar valores nulos por sí mismo. Puede combinar fácilmente múltiples validadores por campo de entrada.

Cualquier manejo especial de errores, como la adición de bordes rojos o la visualización de mensajes de error puede implementarse en el método onError del formulario o agregando FeedbackBorder a los campos apropiados.

+0

El problema aquí es que no tengo control sobre cómo se indica el error. Me gustaría agregar un borde rojo al campo de texto, pero wicket colocará un mensaje de error en un panel de comentarios. No quiero usar un panel de Comentarios. –

+0

@AndrewFielden Esto se puede archivar implementando onError() para el formulario. Extendí mi respuesta para cubrir esto. – Nicktar

+0

Gracias. Los tipos que escribieron Wicket han pensado en todo. –

1

Una mejor manera (y reutilizable) para hacer esto es reemplazar el método isEnabled(Component) del comportamiento:

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); 

Ahora tiene que personalizar el mensaje de error. Así que la subclase FeedbackPanel.

usted puede encontrar más información en el siguiente link

Añadir esta clase a su forma o componente

Cuestiones relacionadas