In the following code:

            add(new Button("saveButton")

            {
                public void onSubmit()
                {
                    //save form values, redirect
@@                    Product product = (Product)getModelObject();
                    ProductProxy.addProduct(product);
                    setResponsePage(new EditProduct());
                }
            });

The line marked @@ is wrong. You ask from the submit button the modelobject. Because the button doesn't have a model (model == null), and the form has a compound model, it will use the component id "saveButton" as an OGNL _expression_ with the form modelobject as base.

This happened because you create an anonymous subclass on the Button. The event handler 'onSubmit' has a this pointer to the button.

This can be solved by changing the line to the following:
Product product = (Product)getParent().getModelObject();

Martijn


On 3/20/06, Vincent Jenks <[EMAIL PROTECTED]> wrote:
OK, believe it or not, I did just that and *still* cannot get it to work.

Here's my Form class:


    private static class EditProductForm extends Form
    {
        public EditProductForm(String name, Product product)
        {
            super(name, new CompoundPropertyModel(product));
           
            //get collection of Category items
            IModel catsModel = new LoadableDetachableModel()
            {
                protected Object load()
                {
                    return ProductProxy.getAllCategories(); //via proxy
                }
            };
           
            //add form components
            add(new TextField("productCode").add(RequiredValidator.getInstance()));
            add(new TextField("name").add(RequiredValidator.getInstance()));
            add(new TextArea("summary").add( RequiredValidator.getInstance()));
            add(new TextArea("description").add(RequiredValidator.getInstance()));
            add(new TextField("unitPrice"));
            add(new TextField("weight"));
            add(new TextField("height"));
            add(new TextField("width"));
            add(new TextField("length"));
            add(new TextField("insuredValue"));
            add(new CheckBox("freeShipping"));
            add(new TextField("thumbnail").add(RequiredValidator.getInstance()));
            add(new TextField("photo").add(RequiredValidator.getInstance ()));
           
            //add reset button
            add(new Button("cancelButton")
            {
                public void onSubmit()
                {
                   
                    setResponsePage(new EditProduct());
                }
            }.setDefaultFormProcessing(false));
           
            //add reset button
            add(new Button("saveButton")

            {
                public void onSubmit()
                {
                    //save form values, redirect
                    Product product = (Product)getModelObject();
                    ProductProxy.addProduct(product);
                    setResponsePage(new EditProduct());
                }
            });
        }
    }

The cancel button works now but the save button is now throwing an exception:

wicket.WicketRuntimeException : Method public abstract void wicket.markup.html.form.IFormSubmitListener.onFormSubmitted () of interface java.lang.reflect.Method threw an exception ...
...
Caused by: java.lang.reflect.InvocationTargetException ...
...
Caused by: wicket.WicketRuntimeException: OGNL Exception: _expression_='saveButton'; path='4:editProductForm:saveButton'
...
Caused by: ognl.NoSuchPropertyException: com.myapp.model.Product.saveButton
...

Here's the form HTML just in case I'm goofing something there:

<form wicket:id="editProductForm" id="editProductForm">
...
                                    <tr>
                                        <td colspan="2">
                                            <input type="submit" wicket:id="saveButton" value="Save" />
                                            &nbsp;
                                            <input type="submit" wicket:id="cancelButton" value="Cancel" />
                                            <br />
                                            <br />
                                        </td>
                                    </tr>
                                    </form>

What's wrong w/ this?

Thanks!


On 3/19/06, Igor Vaynberg < [EMAIL PROTECTED]> wrote:
the easiest way to do this is add two buttons with two onsubmit handlers instead of using the form's onsubmit.

so add(new Button("save") { onsubmit() { // do the saving here } })

add(new Button("cancel") { onsubmit() { //navigate away here } }.setDefaultFormProcessing(false));

notice the call to setDefaultFormProcessing(false) on the cancel button. this will tell wicket that when this button is pressed it should not validate/update model instead go directly to the button's onsubmit handler.

-Igor



On 3/19/06, Riyad Kalla <[EMAIL PROTECTED]> wrote:
Don't you need to commit the response?

(just a lame guess from the servlet world)

On 3/19/06, Vincent Jenks < [EMAIL PROTECTED]> wrote:
> Alright, did that, now the button doesn't do anything at *all*.
>
> Here's the HTML button:
>
> <input type="button" wicket:id="cancelButton" value="Cancel" />
>
> ...and the event handler:
>
>
>             add(new Button("cancelButton")
>             {
>                 public void onClick()
>                 {
>                     setResponsePage(new Home());
>                 }
>             });
>
> Any ideas?
>
>
> On 3/19/06, Justin Lee <[EMAIL PROTECTED]> wrote:
> > -----BEGIN PGP SIGNED MESSAGE-----
> > Hash: RIPEMD160
> >
> > Make sure the cancel button is type="button" and not type="submit".
> > then just define an onClick for your cancel button to navigate where you
> > want.
> >
> > Vincent Jenks wrote:
> > > So, I'm trying to figure out if I should do with my form buttons.  I
> > > have two buttons ('save' and 'cancel') but only the onSubmit event
> > > handler is fired.  I have a button inside of the form's constructor that
> > > has an onClick event but that never happens...apparently because the
> > > onSubmit 'trumps' the onClick event.
> > >
> > > Here's my class as it stands:
> > >
> > >     private static class EditProductForm extends Form
> > >     {
> > >         public EditProductForm(String name, Product product)
> > >         {
> > >             super(name, new
> CompoundPropertyModel(product));
> > >
> > >             //get collection of Category items
> > >             IModel catsModel = new LoadableDetachableModel()
> > >             {
> > >                 protected Object load()
> > >                 {
> > >                     return ProductProxy.getAllCategories (); //via proxy
> > >                 }
> > >             };
> > >
> > >             //add form components
> > >             add(new
> > > TextField("productCode").add(RequiredValidator.getInstance ()));
> > >             add(new
> TextField("name").add(RequiredValidator.getInstance()));
> > >             add(new
> > > TextArea("summary").add(RequiredValidator.getInstance()));
> > >             add(new Button("saveButton"));
> > >
> > >             //add reset button DOESN'T WORK!
> > >             add(new Button("cancelButton")
> > >             {
> > >                 public void onClick()
> > >                 {
> > >                     modelChanged();
> > >                     setResponsePage(new EditProduct());
> > >                 }
> > >             });
> > >         }
> > >
> > >         public void onSubmit()
> > >         {
> > >             //save form values, redirect
> > >             Product product = (Product)getModelObject();
> > >             ProductProxy.addProduct(product);
> > >             setResponsePage(new EditProduct());
> > >         }
> > >     }
> > >
> > > Should I leave onSubmit empty and use two onClick events for the form
> > > buttons?
> > >
> > > The form is doing validation, also, if that effects anything.
> > >
> > > Thanks!
> >
> > - --
> > Justin Lee
> > http://www.antwerkz.com
> > AIM : evan chooly
> > 720.299.0101
> > -----BEGIN PGP SIGNATURE-----
> > Version: GnuPG v1.4.2.1 (Cygwin)
> >
> >
> iD8DBQFEHc0jJnQfEGuJ90MRA/G9AJ0S8yAzsWWQH802nSef+LS23qNbMACcCWjR
> > SDlWuEAvGEj6mweK4RudZ5U=
> > =WtvB
> > -----END PGP SIGNATURE-----
> >
> >
> > -------------------------------------------------------
> > This SF.Net email is sponsored by xPML, a groundbreaking scripting
> language
> > that extends applications into web and mobile media. Attend the live
> webcast
> > and join the prime developer group breaking into this new coding
> territory!
> >
> http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
> > _______________________________________________
> > Wicket-user mailing list
> > Wicket-user@lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/wicket-user
> >
>
>


-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmdlnk&kid0944&bid$1720&dat1642
_______________________________________________
Wicket-user mailing list
Wicket-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/wicket-user





--
Cast your final vote for Wicket in the SourceForge.net 2006 Community Choice Awards!
http://www.wilsonresearch.com/2006/ostgawards06/ostgawards4.php

Reply via email to