[jsf] Come posso passare la riga selezionata a commandLink all'interno di dataTable o ui: repeat?



1 Answers

In JSF 1.2 questo è stato fatto da <f:setPropertyActionListener> (all'interno del componente comando). In JSF 2.0 (EL 2.2 per la precisione, grazie a BalusC) è possibile farlo in questo modo: action="${filterList.insert(f.id)}

Question

Sto usando Primefaces in un'applicazione JSF 2. Ho un <p:dataTable> , e invece di selezionare le righe, voglio che l'utente sia in grado di eseguire direttamente varie azioni su singole righe. Per questo, ho diversi <p:commandLink> s nell'ultima colonna.

Il mio problema: come posso passare un ID di riga all'azione avviata dal link di comando in modo da sapere su quale riga agire? Ho provato a usare un <f:attribute> :

<p:dataTable value="#{bean.items}" var="item">
    ...
    <p:column>
        <p:commandLink actionListener="#{bean.insert}" value="insert">
            <f:attribute name="id" value="#{item.id}" />
        </p:commandLink>
    </p:column>
</p:dataTable>

Ma produce sempre 0 - apparentemente la variabile di riga f non è disponibile quando l'attributo è reso (funziona quando uso un valore fisso).

Qualcuno ha una soluzione alternativa?




Grazie a questo sito di Mkyong , l'unica soluzione che ha effettivamente funzionato per farci passare un parametro è stata questa

<h:commandLink action="#{user.editAction}">
    <f:param name="myId" value="#{param.id}" />
</h:commandLink>

con

public String editAction() {

  Map<String,String> params = 
            FacesContext.getExternalContext().getRequestParameterMap();
  String idString = params.get("myId");
  long id = Long.parseLong(idString);
  ...
}

Tecnicamente, non è possibile passare direttamente al metodo stesso, ma alla JSF request parameter map .




Related