Validation Wicket:条件验证器

Validation Wicket:条件验证器,validation,wicket,Validation,Wicket,我有一个表单,它的输入在某些组合中是必需的,这也取决于单击了哪个提交按钮 例如,字段A、B和C以及提交按钮M、N和有效组合为 M:A+B N:A+B+C N:A N:C 因此,不需要任何输入 目前我在onSubmit()中使用if(…)来解决这个问题,但我想知道:我是否可以将这些检查移动到一个带有回调(dis)批准特定组合的每个组件验证器 更新: 登录需要用户名和密码。 注册需要所有,在这种情况下,它注册, 或者只发送邮件,或者只发送用户名,在这种情况下,它会发送一封密码重置挑战邮件。我建议您将

我有一个表单,它的输入在某些组合中是必需的,这也取决于单击了哪个提交按钮

例如,字段A、B和C以及提交按钮M、N和有效组合为 M:A+B N:A+B+C N:A N:C

因此,不需要任何输入

目前我在
onSubmit()
中使用if(…)来解决这个问题,但我想知道:我是否可以将这些检查移动到一个带有回调(dis)批准特定组合的每个组件验证器

更新:

登录需要用户名和密码。 注册需要所有,在这种情况下,它注册,
或者只发送邮件,或者只发送用户名,在这种情况下,它会发送一封密码重置挑战邮件。

我建议您将AjaxFormComponentUpdateingBehaviors添加到组件中,然后通过禁用当前组合中不可用的所有组件

formComponent.setEnabled(false);
target.add(formComponent);

禁用的组件将不在验证中考虑。另一个好处是,用户总是能够立即获得有关允许组合的反馈。

请看一下上一个示例,它应该可以很好地解决您的问题:

按钮提交=新按钮(“提交”){
提交时公共无效(){
//处理表格提交
}
}
添加(提交)表格;
TextField foo=新的TextField(“foo”){
公共布尔值isRequired(){
formform=(Form)findParent(Form.class);
返回表单.getRootForm().findSubmittingButton()==按钮;
}
}
表格.增补(foo);

如果您需要任何进一步的帮助或它不起作用,请告诉我。干杯

假设表单看起来是这样的:

TextField user = new TextField();
user.setRequired(true);
TextField pass = new TextField();
TextField email = new TextField();
Button login = new Button();
Button register = new Button();
public class MyValidator extends AbstractFormValidator
{
   private FormComponent[3] fields;

   public MyValidtor(TextField field1, TextField, field2, Button button)
   {
      fields = {field1, field2, button };
   }

   //getDependentFormComponents returns fields;

   public void validate(Form form)
   {
      if ( form.getRootForm().findSubmittingButton() == button)
      {
         //do field1 & field2 required checks here
      } 
   }
}
我会尝试创建一个FormValidator类,如下所示:

TextField user = new TextField();
user.setRequired(true);
TextField pass = new TextField();
TextField email = new TextField();
Button login = new Button();
Button register = new Button();
public class MyValidator extends AbstractFormValidator
{
   private FormComponent[3] fields;

   public MyValidtor(TextField field1, TextField, field2, Button button)
   {
      fields = {field1, field2, button };
   }

   //getDependentFormComponents returns fields;

   public void validate(Form form)
   {
      if ( form.getRootForm().findSubmittingButton() == button)
      {
         //do field1 & field2 required checks here
      } 
   }
}
然后只需将
MyValidator
添加到表单中即可

form.add(new MyValidator(user, pass,  login));
form.add(new MyValidator(user, email, register));

你看过我的验证器了吗?它允许您指定依赖项。但这并不能解决验证根据单击的按钮不同而不同的问题。我希望重用现有的验证程序,但根据这些条件“激活”它们。也许我可以将它们链接到我的impl.+1后面,但这不是我的情况下的一个选项,请参阅更新的问题。如果有,请将此答案标记为已解决,好吗?也会帮我的。谢谢