Question

I'm at the end of my rope with this one. I'm new to JSF so this is probably my misunderstanding of a lot of stuff.

<ui:composition>
    <f:view>
         <tr:form>
             <ui:fragment rendered="#{param['type'] eq 'myType'}">
                <ui:include src="/home/myPage.jspx" />
            </ui:fragment>
        ......

I pass the page a certain type, it display's certain fields/criteria for a form and a bean backs it all because there is a single search.

Within myPage.jspx I have:

action="#{MyBean.submitForm}"

does not work, although a onsubmit="alert('hi');" does work as an attribute of the form element.

I guess what's most confusing is that

valueChangeListener="#{MyBean.stateChanged}"

does work on a field in the myPage.jspx

Why does the action (attribute of a button) not work?

Was it helpful?

Solution

During processing of the form submit, if the button or one of its parent components is not rendered, then the button's action won't be invoked. You need to make sure that the rendered attribute evaluates the same during processing of the form submit as it did when the form was displayed. In your case, you're depending on the value of a request parameter with the name type.

In this particular case, you could solve the problem by retaining the request parameter type by a <f:param> nested in the command button:

<h:commandButton ...>
    <f:param name="type" value="#{param.type}" />
</h:commandButton>

Or, if you're using JSF 2.0, placing the bean in the view scope and setting the type parameter in the managed bean by <f:viewParam> can also solve it.

<f:metadata>
    <f:viewParam name="type" value="#{bean.type}" />
</f:metadata>

...

<ui:fragment rendered="#{bean.type eq 'myType'}">

See also:

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top