Можно ли в Wicket вкладывать формы, которые не зависят друг от друга? - PullRequest
1 голос
/ 05 ноября 2010

Можно ли в 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 - отдельная форма будет находиться под существующей формой в иерархии компонентов.

Можно ли как-то разделить формы, несмотря на иерархию? Или есть какое-то другое решение, которое я могу использовать?

EDIT:
В ответ на комментарий Дона Роби, это немного ближе к тому, как выглядел мой код, когда я пытался 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 ]

4 голосов
/ 06 ноября 2010

Существует еще более простое решение: вызовите метод setDefaultFormProcessing для кнопки отмены с false в качестве параметра:

cancelButton.setDefaultFormProcessing(false);

Таким образом, нажатие кнопки отмены пропустит проверку формы (и обновление модели), непосредственно вызвав функцию onSubmit.

2 голосов
/ 07 ноября 2010

Можно "вкладывать" формы в калитку.

См. эту запись в вики для некоторых заметок о том, как это работает, и этой записи в вики о том, как она взаимодействует с проверкой.

Но для того, что вы ищете, ответ от Jawher должен был сработать, и он намного проще.

Посмотрите на этот пример кода , чтобы узнать, как это работает.

Мне интересно, не упростили ли вы свой код в этой публикации. Можете ли вы сделать образец, достаточно маленький, чтобы опубликовать, что определенно имеет проблему?

...