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

时间:2011-11-02 11:39:49

标签: java wicket

我有一个wicket表单,其中包含许多TextField输入组件。大多数输入附有一个验证器。

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

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

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

public final void processInput()
{
    inputChanged();
    validate();
    if (hasErrorMessage())
    {
        invalid();
    }
    else
    {
        valid();
        updateModel();
    }
}

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

1 个答案:

答案 0 :(得分:7)

我敢打赌FormComponent.processInput()在这里根本没有被召唤。当您提交Form时,Form.process()会被调用。在那里,它会调用Form.validate(),然后调用Form.validateComponents(),最终使用FormComponent.validate()

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

你可以:

  • 将所有FormComponent独立验证移至FormValidator。在那里,您可以选择更新通过其验证的FormComponents的模型。
  • 实施Form.onError()并使用访问者更新有效FormComponents的模型。
  • 覆盖Form.process()并修改// If a validation error occurred分支以使用您自己的方法将组件标记为有效/无效,并更新(或不更新)模型对象,具体取决于FormComponent有错误。 FormComponent.hasErrorMessage()会告诉您某个FormComponent验证失败。

更新

在讨论了OP丢失用户输入的原因之后,结果发现FormComponentsListView添加到setReuseItems没有true设置为{{1} }}。这导致FormComponents在每个ListView.populateItem()上重新创建,因此丢失了所有用户输入。

可以找到有关此问题性质的更多信息here

  

但是,使用时必须注意一些规定   表格中的转发器。通常中继者清除他们的项目   每个请求的开头,通常在表单内部时   因为你想保留旧物品而不受欢迎   希望他们保持自己的状态而不是重新创造新鲜感。

     

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