Hi!

AjaxFormComponentUpdatingBehavior does not submit the other form
values, only the involved component. If you want to handle other form
values you will need something like AjaxFormSubmitBehavior or
AjaxFormSubmittingChangeListenerBehavior:


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) {
    HttpServletRequest httpServletRequest = ((WebRequest) getComponent()
        .getRequest()).getHttpServletRequest();

    Map parameters;

    if (httpServletRequest instanceof MockHttpServletRequest) {
      parameters = ((MockHttpServletRequest)
httpServletRequest).getParameterMap();
    } else {
      parameters = ((org.mortbay.jetty.Request)
httpServletRequest).getParameters();
    }

    parameters.put(getHiddenFieldId(getForm()),
getComponent().urlFor(IOnChangeListener.INTERFACE));

    final FormComponent<?> formComponent = (FormComponent<?>) getComponent();

    try {
      if (isUpdateModel()) {
        formComponent.inputChanged();
        formComponent.validate();

        if (!formComponent.hasErrorMessage()) {
          formComponent.valid();
          formComponent.updateModel();
        }
      }

      super.onEvent(target);
    } catch (RuntimeException e) {
      Utils.errorLog(AjaxFormSubmittingChangeListenerBehavior.class, e);
      onError(target);
    }
  }

  /**
   * @return boolean
   */
  protected boolean isUpdateModel() {
    return true;
  }

  /**
   * @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);
    }
  }
}


2010/1/4 Steve Hiller <sh...@bellsouth.net>:
> Hi All,
>
> I'm having an issue when using WicketTester with a form that has 3
> DropDownChoice component, which are linked together using the
> AjaxFormComponentUpdatingBehavior. In the following code snippet,
> selecting from the "brands" DropDownChoice causes the "categories"
> DropDownChoice to be filled. Then, selecting from the "categories"
> DropDownChoice causes the "titles" DropDownChoice to be filled.
>
> All of this works fine. However, the call to formTester.submit()
> does not trigger the form's onSubmit method. Any ideas what I am
> doing wrong? This is using Wicket version 1.3.7.
>
> Thanks,
> Steve
>
> ----------
> WicketTester tester = new WicketTester(webapp);
> tester.setupRequestAndResponse();
>
> FormTester formTester = tester.newFormTester("mainPanel:officeSelectorForm");
> formTester.select("brands", 0);
> tester.executeAjaxEvent("mainPanel:officeSelectorForm:brands", "onchange");
> tester.assertComponentOnAjaxResponse("mainPanel:officeSelectorForm:categories");
> formTester.select("categories", 0);
> tester.executeAjaxEvent("mainPanel:officeSelectorForm:categories", 
> "onchange");
> tester.assertComponentOnAjaxResponse("mainPanel:officeSelectorForm:titles");
> formTester.select("titles", 0);
>
> formTester.submit();
> ----------
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org

Reply via email to