2012-09-08 19 views
6

Używam JSF i Primefaces i moje pytanie brzmi:JSF ViewParam z CommandButton

Mam stronę (page1.jsf), które recive rzutem param z listą ciągów (spacjami):

<f:metadata> 
<f:viewParam name="list" value="#{bean1.list}" converter="listConverter"/> 
</f:metadata> 

ListConverter przekształcić ciąg na listę pojedynczych słów. Jeśli uzyskuję dostęp do strony przez URL (np. Page1.jsf? List = word1 word2 word3 ") wszystko działa dobrze!

Ale teraz próbuję użyć innej strony (page2.jsf), aby utworzyć tę listę . terminów Używam Primeface DataTable, zgodnie z następującym przykładem: http://www.primefaces.org/showcase/ui/datatableRowSelectionRadioCheckbox.jsf

Chcę tomake możliwe dla użytkownika, aby wybrać wiele wierszy (pole wyboru Primeface przykład), a następnie nacisnąć przycisk, który odsyła do page1.jsf i również przekazuje listę wybranych elementów jako parametr (np. przy użyciu przykładu Prezentacja Primeface, przekazać listę wybranych modeli samochodów)

Próbuję zrobić jego:

<p:commandButton action="page1?faces-redirect=true&amp;includeViewParams=true" > 
<f:attribute name="list" value="#{bean2.convertSelectedItemsToString()}" /> 
</p:commandButton> 

lub to:

<p:commandButton action="page1?faces-redirect=true&amp;includeViewParams=true" > 
<f:param name="list" value="#{bean2.convertSelectedItemsToString()}" /> 
</p:commandButton> 

gdzie bean2 ma selectedItems [] Z wybranych obiektów.

Nie trzeba dodawać ... To nie działa.

Każda pomoc? Z góry dzięki.

Odpowiedz

7

Przycisk polecenia nie używa atrybutu ani parametru do skonstruowania adresu URL, do którego następuje przekierowanie.

W tym celu zwykle używasz h:commandLink lub opcjonalnie h:outputLink, ale musisz mieć świadomość, że będą renderować parametry w momencie, w którym strona była żądana. Jeśli użytkownik wprowadzi zmiany w selekcji po tym, nie zostaną one odzwierciedlone w łączu.

Alternatywą, która dałaby ci najnowszy wybór, jest użycie metody działania i skonstruowanie tam przekierowania.

E.g.

<p:commandButton action="#{bean2.navigateWithSelection}" /> 

A potem w swoim Fasola:

public String navigateWithSelection() { 
    return "page1?faces-redirect=true&" + convertSelectedItemsToString(); 
} 

zgodnie komentarzach, jeśli bean2 jest ogólnym fasola, że ​​nie ma wiedzy na temat strony, można przekazać na stronie docelowej jako parametr:

<p:commandButton action="#{bean2.navigateWithSelection('page1')}" /> 

A potem znowu w fasoli:

+0

Jako rozwiązanie tymczasowe zastosowałem drugie podejście. Ale nie podoba mi się to, ponieważ w ten sposób mój kontroler (fasola) jest silnie uzależniony od moich poglądów. Spodziewałem się, że jsf da mi lepsze rozwiązanie. – userk

+0

W JSF backing bean jest według konwencji "przypuszcza się", że wspiera pojedynczy widok, tak że backing bean może być zależny od widoku. Nie jest 'bean2.convertSelectedItemsToString' już wyświetlają konkretne, czy robisz coś ogólnego? Jeśli potrzebujesz ogólnego rozwiązania, możesz przekazać stronę jako parametr. Zobacz zaktualizowaną odpowiedź. –

+0

To sprytne obejście! Zrobię to! Dzięki. – userk

Powiązane problemy