Apache wicket:validation错误后如何更新模型

我有与dateTimeField和ListView的窗体。 ListView看起来像这样:

final ListView<String> countryView = new ListView<String>("country", model.<List<String>>bind("country")) { @Override protected void populateItem(final ListItem<String> item) { final String country = item.getModelObject(); item.add(new ValidationDisplayableLabel("country", country, new String[] { modelPath })); item.add(new AjaxLink("deleteLink") { @Override public void onClick(AjaxRequestTarget target) { model.getObject().getCountry().remove(country); if (issPeriod) { addButton.setVisible(true); countryTextField.setVisible(true); findButton.setVisible(true); } if (target != null) target.addComponent(rowPanel); } }); } }; countryTextField = new ValidationDisplayableTextField("countryCodeInput", model.bind("oneCountry"), "job.country.value"); **countryView.setReuseItems(true);** rowPanel.add(countryView); rowPanel.add(countryTextField); addButton.setOutputMarkupPlaceholderTag(true); rowPanel.add(addButton); 

而addButton看起来像这样:

 AjaxSubmitLink addButton = new AjaxSubmitLink(LinkNames.addCountry.toString()) { @Override public void onSubmit(AjaxRequestTarget target, Form form) { if (model.getObject().getOneCountry() != null) addCountry(); if (target != null) target.addComponent(rowPanel); target.addComponent(form.getPage().get("feedbackPanel")); } @Override protected void onError(AjaxRequestTarget target, Form<?> form) { onSubmit(target, form); } }; 

问题是,当我的dateTimeField(例如设置小时数为100)失败时,在countryTextField中input国家/地区代码,然后按下addButton,它将在反馈面板中显示validation消息,该小时范围不正确,但不添加国家。 这是因为我的模型没有更新。 也许有办法手动更新它? 所以validation信息会显示,但国家listView仍然可以更新?

整个表单的提交是在其他button上,所以即使在dateTimeField中存在validation错误,从逻辑上来说,添加国家也是正常的。

谢谢!

PS我读了很多关于类似问题的post,但是其中大部分都是用.setReuseItems(true)解决的,但是在我的情况下它不起作用。

PPS Apache wicket 1.4.17

    我在项目中遇到了类似的问题,我发现的解决方法是使用特殊的访问者。 即使提交的输入无效,它也会更新模型。

     public class VisitorUpdateModelWithoutValidation implements FormComponent.IVisitor { public Object formComponent(IFormVisitorParticipant formComponent) { if (formComponent instanceof FormComponent) { final FormComponent<?> formComponent1 = (FormComponent<?>) formComponent; boolean required = formComponent1.isRequired(); if (required) { formComponent1.setRequired(false); } formComponent1.modelChanging(); formComponent1.validate(); formComponent1.updateModel(); formComponent1.modelChanged(); if (required) { formComponent1.setRequired(true); } } return Component.IVisitor.CONTINUE_TRAVERSAL; } } 

    只需在你的行为的onSubmit方法中使用它: getForm().visitFormComponents(new VisitorUpdateModelWithoutValidation());

    作为这个答案的更新,在Wicket 6中,你可以通过覆盖表单中的onError()来完成这个工作:

     @Override protected void onError() { super.onError(); this.updateFormComponentModels(); } 

    在更新目标之前,您可以在要更新的字段上发出field.clearInput() )。