Hi! Here is the final solution. The behavior enables ajax FormSubmitting component without default form processing (i.e., analogous to IOnChangeListener). I hope I got it right because that's what I need ;)
I created a jira issue (https://issues.apache.org/jira/browse/WICKET-2562) proposing to overcome the reflection hacks: public abstract class AjaxFormSubmittingChangeListenerBehavior extends AjaxFormSubmitBehavior { private final static Method hiddenFieldGetter; static { try { hiddenFieldGetter = Form.class.getDeclaredMethod("getHiddenFieldId"); hiddenFieldGetter.setAccessible(true); } catch (Exception e) { throw new RuntimeException(e); } } /** * @see org.apache.wicket.ajax.AbstractDefaultAjaxBehavior#onBind() */ @Override protected void onBind() { super.onBind(); if (!(getComponent() instanceof IOnChangeListener)) { throw new WicketRuntimeException("Behavior " + getClass().getName() + " can only be added to an instance of a IOnChangeListener"); } } /** * @param event */ public AjaxFormSubmittingChangeListenerBehavior(String event) { super(event); } /** * @see org.apache.wicket.ajax.form.AjaxFormSubmitBehavior#onError(org.apache.wicket.ajax.AjaxRequestTarget) */ @Override protected void onError(AjaxRequestTarget target) { onSubmit(target); } /** * @see org.apache.wicket.ajax.form.AjaxFormSubmitBehavior#onEvent(org.apache.wicket.ajax.AjaxRequestTarget) */ @Override protected void onEvent(AjaxRequestTarget target) { org.mortbay.util.MultiMap parameters = ((org.mortbay.jetty.Request) ((WebRequest) getComponent() .getRequest()).getHttpServletRequest()).getParameters(); parameters.put(getHiddenFieldId(getForm()), getComponent().urlFor(IOnChangeListener.INTERFACE)); super.onEvent(target); } /** * @param form * @return String */ private String getHiddenFieldId(Form<?> form) { try { Form<?> root = form.getRootForm(); return (String) hiddenFieldGetter.invoke(root); } catch (Exception e) { throw new RuntimeException(e); } } } ** Martin 2009/11/4 Martin Makundi <martin.maku...@koodaripalvelut.com>: > Hi! > > The proposed solution does not work with Modal Windows!! > * http://osdir.com/ml/users-wicket.apache.org/2009-11/msg00076.html > > Modal windws have a fake parent form: > > <form style="border-width: 0px; margin: 0px; padding: 0px; > background-color: transparent; position: static;"> > > .. and ofcourse it does not have a hidden input field... > > .. so the solution gets a bit nastier... > > .. we must fake the hidden field value into the request ... ? > > Is there another less pervasive way to do this? Maybe alter wicket a bit ;) ? > > The solution here is implementation specific and probably works with jetty > only: > > > public abstract class > AjaxFormSubmittingChangeListenerDropDownChoice<T> extends > DropDownChoice<T> { > private final static Method hiddenFieldGetter; > static { > try { > hiddenFieldGetter = Form.class.getDeclaredMethod("getHiddenFieldId"); > hiddenFieldGetter.setAccessible(true); > } catch (Exception e) { > throw new RuntimeException(e); > } > } > > /** Initialize */ { > add(new AjaxFormSubmitBehavior(JavaScriptConstants.ONCHANGE) { > > �...@override > protected void onError(AjaxRequestTarget target) { > AjaxFormSubmittingChangeListenerDropDownChoice.this.onError(target); > } > > �...@override > protected void onSubmit(AjaxRequestTarget target) { > AjaxFormSubmittingChangeListenerDropDownChoice.this.onSubmit(target); > } > > /** > * @see > org.apache.wicket.ajax.form.AjaxFormSubmitBehavior#onEvent(org.apache.wicket.ajax.AjaxRequestTarget) > */ > �...@override > protected void onEvent(AjaxRequestTarget target) { > org.mortbay.util.MultiMap parameters = > ((org.mortbay.jetty.Request) ((WebRequest) > getRequest()).getHttpServletRequest()).getParameters(); > > parameters.put(getHiddenFieldId(AjaxFormSubmittingChangeListenerDropDownChoice.this.getForm()), > > AjaxFormSubmittingChangeListenerDropDownChoice.this.urlFor(IOnChangeListener.INTERFACE)); > super.onEvent(target); > } > > /** > * @param form > * @return String > */ > private String getHiddenFieldId(Form<?> form) { > try { > Form<?> root = form.getRootForm(); > return (String) hiddenFieldGetter.invoke(root); > } catch (Exception e) { > throw new RuntimeException(e); > } > } > > }); > } > } > > > ** > Martin > >> 2009/11/4 Jeremy Thomerson <jer...@wickettraining.com>: >>> The power of this list is amazing - it seems you just had an entire thread >>> with yourself and answered your own question. SYNERGY! :) >>> >>> But seriously, did you have any remaining questions on this that we could >>> assist with? >>> >>> >>> -- >>> Jeremy Thomerson >>> http://www.wickettraining.com >>> >