2012-04-25 34 views
5

Tôi có một TextField Wicket, trong đó có một giá trị IntegerLàm cách nào để kiểm tra giá trị null trong một Wicket Textfield?

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

Tôi gắn một validator tùy chỉnh này, như sau

currentValueTextField.add(new IntegerValidator()); 

Lớp validator là

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

Tuy nhiên nếu tôi không nhập gì vào trường văn bản, phương thức onValidate() của tôi sẽ không được gọi.

Cách được khuyến nghị để kiểm tra giá trị null trong trường hợp này là gì? Tôi cũng muốn kiểm tra phạm vi giá trị đã nhập.

+0

Tôi không biết về Wicket nhưng trong khuôn khổ web khác mà tôi biết xác nhận không được gọi cho trống Trường văn bản. Một số cung cấp cờ bổ sung cho các thẻ của họ để kích hoạt/vô hiệu hóa các kiểm tra bắt buộc trong khi ở những người khác bạn có thể phải kiểm tra khi đưa các giá trị biểu mẫu vào mô hình (hoặc kiểm tra mô hình sau đó). – Thomas

Trả lời

3

Ghi đè validateOnNullValue() theo mặc định là false.

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

Đây là mô tả của validateOnNullValue() phương pháp:

Cho biết hay không để xác nhận giá trị nếu nó là null. Nó thường được mong muốn bỏ qua xác nhận nếu giá trị là null, trừ khi chúng tôi muốn đảm bảo giá trị thực tế là null (trường hợp hiếm khi sử dụng). Người xác thực mở rộng điều này và muốn đảm bảo giá trị là null phải ghi đè phương thức này và trả lại true.

+0

Ghi đè validateOnNullValue() không làm trình duyệt tính hợp lệ của tôi được gọi, nhưng điều thú vị là giá trị trong mô hình của tôi không được đặt thành rỗng.Vì vậy, mã validator của tôi sẽ không gây ra lỗi vì nó cho rằng textfield có giá trị không null. –

+0

Mmm ... Nhưng 'null' phải ở đây' validatable.getValue() ', khi bạn vượt qua ném trình xác thực giá trị vẫn chưa được đặt trên mô hình. – jordeu

+0

Cảm ơn! validatable.getValue() đã làm các trick. –

4

chỉ cần gọi

currentValueTextField.setRequired(true); 

để đánh dấu các lĩnh vực theo yêu cầu và có Wicket xử lý giá trị null trên riêng của nó. Bạn có thể dễ dàng kết hợp nhiều trình xác thực cho mỗi trường nhập.

Bất kỳ xử lý lỗi đặc biệt nào, như thêm đường viền màu đỏ hoặc hiển thị thông báo lỗi có thể được triển khai theo phương thức onError của biểu mẫu hoặc bằng cách thêm FeedbackBorder s vào các trường thích hợp.

+0

Vấn đề ở đây là tôi không thể kiểm soát cách lỗi được chỉ ra. Tôi muốn thêm đường viền màu đỏ vào trường văn bản, nhưng wicket sẽ đặt thông báo lỗi trong bảng Phản hồi. Tôi không muốn sử dụng bảng Phản hồi. –

+0

@AndrewFielden Điều này có thể được lưu trữ bằng cách thực hiện onError() cho biểu mẫu. Tôi mở rộng câu trả lời của tôi để trang trải điều này. – Nicktar

+0

Cảm ơn. Những kẻ viết Wicket đã nghĩ về mọi thứ. –

1

Cách tốt hơn (và tái sử dụng) để làm điều này là để ghi đè lên các phương pháp isEnabled(Component) của hành vi:

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

Bây giờ bạn cần để tùy chỉnh các thông báo lỗi. Vì vậy, phân lớp FeedbackPanel.

bạn có thể tìm thêm thông tin trong sau link

Thêm lớp này đến hình thức hoặc thành phần của bạn

Các vấn đề liên quan