Description
DojoAjaxResponseBuilder uses the client id of a component to determine whether or not to render it (see the contains method). Form components (children of AbstractFormComponent) will always have a null client id at this point & hence will never be rendered.
The form components seem to have a null client id because AbstractFormComponent has an abstract setClientId method. This causes tapestry to add a generated getClientId method that overrides the AbstractComponent.getClientId method. If you look at a form component in a debugger you can see the extra $clientId member variables that have been added to the concrete class.
The AbstractFormComponent setClientId method is only invoked by renderIdAttribute. Obviously this happens after the DojoAjaxResponseBuilder calls getClientId to determine whether the component should be rendered.
I think this can be fixed by removing the AbstractFormComponent setClientId method & adding a protected setClientId method to AbstractComponent (that just sets the _clientId member).
This will result in DojoAjaxResponseBuilder calling AbstractComponent.getClientId & being returned the bound id or the IComponent.getId. Either of which should allow it to properly determine whether the component is supposed to be rendered or not.