是否可以在Wicket中嵌套彼此独立的表单?

时间:2010-11-05 19:56:34

标签: java ajax wicket

是否可以在Wicket中嵌套彼此独立的表单?我想要一个带有提交按钮和取消按钮的表单。两个按钮都应该将用户引导到同一页面(让我们称之为Foo)。提交按钮应首先向服务器发送一些信息;取消按钮应该什么都不做。

这是我现有代码的真正简化版本:

Form form = new Form() {
    public void onSubmit()
    {
        PageParameters params = new PageParameters();
        params.put("DocumentID", docID);
        setResponsePage(Foo.class, params);
    }
};

DropDownChoice<String> ddc = new DropDownChoice<String>("name", new PropertyModel<String>(this, "nameSelection"), names);
ddc.setRequired(true);

final Button submitButton = new Button("Submit") {
    public void onSubmit() { doSubmitStuff(true); }
};

final Button cancelButton = new Button("Cancel") {
    public void onSubmit() { doSubmitStuff(false); }
};

form.add(ddc);
form.add(submitButton);
form.add(cancelButton);
form.add(new FeedbackPanel("validationMessages"));

问题是,我刚刚添加了一个验证器,即使我按下取消按钮也会触发,因为取消按钮与其他所有内容都附加在同一表格上。如果取消按钮是单独的形式,则可以避免这种情况。据我所知,我不能创建一个单独的表单,因为 - 由于HTML的结构 - 单独的表单将在组件层次结构中的现有表单下。

我能否以不同的方式将表单分开?或者我可以使用其他解决方案吗?

编辑:
回应Don Roby的评论,这与我在尝试setDefaultFormProcessing()时的代码看起来更接近:

    Form<Object> theForm = new Form<Object>("theForm") {
        public void onSubmit()
        {
            PageParameters params = new PageParameters();
            params.put("DocumentID", docID);
            setResponsePage(Foo.class, params);
        }
    };

    final CheckBox checkbox = new CheckBox("checkbox", new PropertyModel<Boolean>(this, "something"));
    checkbox.add(new PermissionsValidator());
    theForm.add(checkbox);

    final Button saveButton = new Button("Save") {
        public void onSubmit()
        { someMethod(true); }
    };
    final Button cancelButton = new Button("Cancel") {
        public void onSubmit()
        { someMethod(false); }
    };

    cancelButton.setDefaultFormProcessing(false);
    theForm.add(saveButton);
    theForm.add(cancelButton);
    theForm.add(new FeedbackPanel("validationMessages"));

2 个答案:

答案 0 :(得分:4)

有一个更简单的解决方案:使用setDefaultFormProcessing作为参数调用取消按钮上的false方法:

cancelButton.setDefaultFormProcessing(false);

这样,单击取消按钮将绕过表单验证(和模型更新),直接调用onSubmit函数。

答案 1 :(得分:2)

可以在wicket中“嵌套”形式。

参见this wiki entry  关于它是如何工作的一些注释和this wiki entry关于它如何与验证相互作用的注释。

但是对于你所追求的,Jawher的答案应该有效并且更加简单。

请查看此example code以获取有关使其正常工作的提示。

我想知道你是否在这篇文章中简化了你的代码。你能制作一个足够小的样本来发帖吗?