我有一个表单,我需要验证DateFrom和DateTo。
我这样做了:
// start date
RequiredTextField<Date> startdateField =
new RequiredTextField<Date>("startDate", Date.class);
startdateField.add(new DatePicker(){
@Override
protected CharSequence getIconUrl() {
return RequestCycle.get().getUrlRenderer().renderContextPathRelativeUrl("/image/date-picker.png");
}
});
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE,-1);
startdateField.add(DateValidator.minimum(cal.getTime()));
// end date
RequiredTextField<Date> enddateField = new RequiredTextField<Date>("endDate", Date.class);
enddateField.add(new DatePicker(){
@Override
protected CharSequence getIconUrl() {
return RequestCycle.get().getUrlRenderer().renderContextPathRelativeUrl("/image/date-picker.png");
}
});
// enddateField.add(DateValidator.minimum(startdateField.getModel().getObject()));
// this does not work . Form submitted ?
现在我如何设置一个验证器,说明endDate必须等于或大于wicket中选定的开始日期?
有什么想法吗?帮助赞赏。
答案 0 :(得分:3)
DateValidator.minimum(startdateField.getModel().getObject())
不起作用,因为在页面构建时,startdateField
的模型不保存用户提交的值,并且必须在验证时将其视为最小值。
通常,如果您的验证涉及多个组件,则使用IFormValidator
是合适的。在成功调用每个依赖个体validate()
后,将调用其FormComponent.validate()
方法,因此您可以保证在每个依赖组件上都有有效的单独输入,然后再继续验证它们。
验证的一个重要方面是防止无效的用户输入到达组件的模型。因此,在验证时,模型尚未更新,而不是FormComponent.getModelObject()
,您必须在validate()
方法中使用FormComponent.getInput()
或FormComponent.getConvertedInput()
。
IFormValidator validator = new AbstractFormValidator() {
public FormComponent<?>[] getDependentFormComponents() {
return new FormComponent[] { startDateField, endDateField };
}
public void validate(Form<?> form) {
Date startDate = (Date) startDateField.getConvertedInput();
Date endDate = (Date) endDateField.getConvertedInput();
if (endDate.before(startDate)){
error("Date range is invalid.");
}
}
};
form.add(validator);
考虑到如果getDependentFormComponents()
中的任何FormComponents无效(这意味着不可见,必需且没有输入,未通过自定义个人验证等),FormValidator
不会执行。
您可能还会发现此信息非常有用:Validating related fields