Wicket:条件验证器

时间:2013-02-27 12:21:03

标签: validation wicket

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

E.g。字段A,B和C,并提交按钮M,N。并且有效组合是 M:A + B. N:A + B + C. N:A N:C

因此,总是不需要任何输入。

目前我在onSubmit()中使用if(...)来解决它,但我想知道:我是否可以将这些检查移动到具有回调的每个组件验证器,该回调将(dis)批准某些组合?

更新

_______________________

  User name:  ______
  Password:   ______

  [ Log in button ]

  Email:      ______

  [ Register / reset password button ]
_______________________

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

3 个答案:

答案 0 :(得分:2)

看看https://cwiki.apache.org/WICKET/conditional-validation.html处的示例,它几乎可以解决您的问题:

Button submit = new Button("submit") {
    public void onSubmit() {
        // handle form submission
    }
}
form.add(submit);

TextField foo = new TextField("foo") {
    public boolean isRequired() {
        Form form = (Form) findParent(Form.class);
        return form.getRootForm().findSubmittingButton() == button;
    }
}
form.add(foo);

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

答案 1 :(得分:1)

我建议您将AjaxFormComponentUpdatingBehaviors添加到组件中,然后通过

禁用当前组合中不可用的所有组件
formComponent.setEnabled(false);
target.add(formComponent);

验证时不会考虑禁用的组件。另一个好处是,用户始终可以立即获得有关允许组合的反馈。

答案 2 :(得分:0)

假设表格如此:

TextField user = new TextField();
user.setRequired(true);
TextField pass = new TextField();
TextField email = new TextField();
Button login = new Button();
Button register = new Button();

我会尝试创建一个FormValidator类,如下所示:

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));