I added AjaxFallbackButton("Cancel").setDefaultFormProcessing(false) to the multipart form and when it is pressed the form is handled as well as the button would have defaultFormProcessing=true.
It happens because request parameters does not contain the name of the submitting button. The magic is in the new code in wicket-ajax.js // Submits a form using ajax. // This method serializes a form and sends it as POST body. submitForm: function(form, submitButton) { if (this.handleMultipart(form)) { return true; } var body = function() { var s = Wicket.Form.serialize(form); if (submitButton != null) { s += Wicket.Form.encode(submitButton) + "=1"; } return s; } return this.request.post(body); }, I believe the problem is caused by handleMultipart(form) invocation. submitForm function accepts submitButton parameter but does not passes it to handleMultipart function. Igor could you clarify that?