How to pass parameter to f:ajax in h:inputText? f:param does not work

29,255

The <f:param> works in links and buttons only, not in inputs.

If your environment supports EL 2.2, just pass it as method argument instead:

<h:inputText ...>
    <f:ajax listener="#{bean.listener(item.id)}" />
</h:inputText>

public void listener(Long id) {
    // ...
}

You can also just pass the whole item:

<h:inputText ...>
    <f:ajax listener="#{bean.listener(item)}" />
</h:inputText>

public void listener(Item item) {
    // ...
}

If your environment doesn't or can't support EL 2.2, then evaluate EL programmatically instead.

public void listener() {
    FacesContext context = FacesContext.getCurrentInstance();
    Long id = context.getApplication().evaluateExpressionGet(context, "#{item.id}", Long.class);
    // ...
}
Share:
29,255
Shikha Dhawan
Author by

Shikha Dhawan

Working as a Software Developer New to JSF. New to Spring MVC. SOreadytohelp

Updated on December 22, 2020

Comments

  • Shikha Dhawan
    Shikha Dhawan over 3 years

    I need to pass a parameter to the server in my ajax request. Please see the code below. Scope: View Scope

    Without f:param

    <p:column width="40">
        <h:inputText id="originalCostInputTxt" value="#{articlePromo.costoBruto}" 
            <f:ajax event="change"
                execute="@this" 
                listener="#{promotionDetailManagedBean.onCostoBrutoChange}">
            </f:ajax>
        </h:inputText>
    </p:column>
    

    Managed Bean

    public final void onCostoBrutoChange(final AjaxBehaviorEvent event) {
        createCostoBrutoOptions(promoArticlesList);
    }
    

    In this case, the method onCostoBrutoChange() does gets invoked. But, it does not get invoked when I include f:param. Please see the code below.

    With f:param

    <p:column width="40">
        <h:inputText id="originalCostInputTxt" value="#{articlePromo.costoBruto}" 
            <f:ajax event="change"
                execute="@this" 
                listener="#{promotionDetailManagedBean.onCostoBrutoChange}">
             <f:param value="#{articlePromo.promocionArticuloId}" name="myId"/> 
            </f:ajax>
        </h:inputText>
    </p:column>
    

    Managed Bean

    public final void onCostoBrutoChange(final AjaxBehaviorEvent event) {
        createCostoBrutoOptions(promoArticlesList);
        String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("myId");
    }
    

    Not able to identify whats incorrect in this code. Please guide.

    Thanks, Shikha

  • Theo
    Theo over 8 years
    @BalusC I'm evaluating EL programmatically inside c:foreach, using the iteration variable var, but it evaluates to null.