4

我想到的具体情况如下:将 AjaxFormComponentUpdatingBehavior("onchange") 添加到表单中的 TextField 中。该行为验证特定条件下的文本(模型对象或表单组件模型,无关紧要),基于这些条件它可能会显示一条消息(或隐藏它,如果它已经显示)。

问题是,TextField 中还添加了验证器。一种可能的(并且可能的)场景包括用户首先输入一个值,该值导致消息由 AJAX 请求显示。然后,如果他/她输入的值未通过验证,则消息应该消失,但事实并非如此。

显然,要么根本不调用 AJAX 行为的 onUpdate() 方法,要么我尝试插入未验证条目的检查失败(我尝试测试空值和空字符串,但没有有用;我不知道当数据无效时,Wicket 的验证器究竟对模型做了什么)。

我想知道真正了解验证器(或实际上是 AJAX)的人是否对问题出在哪里有任何想法。

如果有人告诉我这不是绑定验证器和 AJAX 的一般问题,但很可能是编程错误,我可以发布编辑和发布代码。我仍然相信前者,因此我将避免发布代码部分,以便继续讨论 API/理论框架。

谢谢。

4

1 回答 1

8

使用 时AjaxFormComponentUpdatingBehavior,如果任何IValidators 验证失败,onError()将被调用而不是onUpdate()。Wicket 会有效防止无效的用户输入到达IModel你组件中的 s,所以组件的 ModelObject 根本不会改变。无效的输入可能会通过getInput()/保持可用getConvertedInput()(不确定它是否会在 AJAX 场景中,它肯定是在传统的表单提交中)。

但是,请考虑到IFormValidator使用此机制时不会执行 s。如果您有任何内容,您可能对覆盖感兴趣,getUpdateModel()这样AjaxFormComponentUpdatingBehavior就不会将可能无效的用户输入带入您IModel的 s,并在您确定用户输入有效时手动设置模型对象。

关于您的具体情况,您可以在中执行所有必需的逻辑onError()(或依赖Model将从其他地方获取数据的 s),并将需要刷新的组件添加到AjaxRequestTarget. 这可能是您的场景中缺少的内容。

于 2012-06-12T08:35:28.640 回答