是否可以返回反馈错误,但仍允许wicket更新组件模型?

And*_*den 6 java wicket

我有一个wicket表单,其中包含许多TextField输入组件.大多数输入都附有Validator.

假设我输入了50个值,其中一个值未通过范围验证器.Wicket然后生成错误反馈消息,但也不更新与每个组件关联的模型.结果是我丢失了刚刚输入的所有50个值,并且必须再次键入它们.

我的问题是,我可以告诉Wicket更新那些具有有效值的组件的模型,但只报告错误值的错误吗?

在框架中挖掘,我注意到FormComponent中的这个代码片段,它似乎表明如果有错误,则不要更新模型.

public final void processInput()
{
    inputChanged();
    validate();
    if (hasErrorMessage())
    {
        invalid();
    }
    else
    {
        valid();
        updateModel();
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法自定义此行为,并实现保留所有有效值的目的?

Xav*_*ica 7

我敢打赌,FormComponent.processInput()这里根本没有被召唤.当你提交Form,Form.process()被叫.在那里,它将Form.validate()调用Form.validateComponents(),最终将调用,最终使用FormComponent.validate().

你在这里遇到的问题是全球处理问题Form.process().表格完全提交,或根本提交.当FormComponent.validate()失败时,Form.hasError()将返回true,因此Form.process()永远不会更新任何模型.

你可以:

  • 将所有FormComponent独立验证移动到a FormValidator.在那里,您可以选择更新FormComponents通过其验证的模型.
  • Form.onError()在那里实现并使用访问者来更新有效的模型FormComponents.
  • 覆盖Form.process()并修改// If a validation error occurred分支以使用您自己的方法将组件标记为有效/无效,并根据FormComponent有错误更新(或不更新)模型对象.FormComponent.hasErrorMessage()会告诉你验证是否失败了FormComponent.

UPDATE

在讨论了使用OP丢失用户输入的原因之后,结果发现FormComponents正在添加到ListViewsetReuseItems设置的内容中true.这导致FormComponents每个都重新创建ListView.populateItem(),因此失去所有用户输入.

有关此问题性质的更多信息,请访问:

但是,在表单中使用转发器时,您需要注意一些规定.通常,重复者在每个请求开始时清除它们的项目,当在表单内部时,这通常是不合需要的,因为您希望保留旧项目,因为您希望它们保持其状态而不是重新创建.

例如,如果使用ListView,则应在表单内调用ListView.setReuseItems(true),以便保留旧项而不是每次都创建新项.