2012-03-20 6 views
1

Я использую Primefaces 3.0. У меня есть DataTable с SelectionMode одного, как показано ниже:Как перейти на другую страницу onRowSelect

<p:dataTable id="paySumm" var="PSummRow" 
value="#{beanPySummary.PySummariesModel}" 
selection="#{beanPySummary.selectedPySummary}" selectionMode="single" paginator="true" 
rows="15" paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} 
{CurrentPageReport} {NextPageLink}" rowsPerPageTemplate="10,15,25,35" > 

<p:ajax event="rowSelect" listener="#{beanPySummary.onRowSelect}" /> 

У меня есть бизнес-логику в методе onRowSelect, а затем я перейти на другую страницу.

public String onRowSelect(SelectEvent event) { 
    ...... 
    ConfigurableNavigationHandler configurableNavigationHandler = 
    getCurrentInstance().getApplication().getNavigationHandler(); 
    configurableNavigationHandler.performNavigation("MoreDetail?faces-redirect=true 
    return ""; 

У меня есть некоторые данные, которые я хотел бы передать как параметры для MoreDeatils с includeViewParam. Я могу определить их как f: ViewParam в MoreDeatils.xhtml. Я не уверен, что мне нужно использовать аннотацию ManagedProperty и в то же время определять эти параметры как скрытые поля на моей текущей странице. Здесь мне нужны советы и указания.

Спасибо, Peter

ответ

1

Вы можете просто отправить редирект на ExternalContext#redirect(). Данные, которые вы хотите отправить, должны быть установлены в строке запроса URL-адреса.

public void onRowSelect(SelectEvent event) throws IOException { 
    String field1 = URLEncoder.encode(this.field1, "UTF-8"); 
    String field2 = URLEncoder.encode(this.field2, "UTF-8"); 
    String field3 = URLEncoder.encode(this.field3, "UTF-8"); 
    String url = "MoreDetail.xhtml?field1=" + field1 + "&field2=" + field2 + "&field3=" + field3; 
    FacesContext.getCurrentInstance().getExternalContext().redirect(url); 
} 

Пожалуйста, обратите внимание, что (AJAX) действий слушателя методы, как предполагается вернуть void.

+0

Thanks BalucsC. Вы здоровы, а не только потому, что вы ответили на мой вопрос, но за то, что приняли боль и помогли другим. Да, у меня был недействительный метод onRowSelect, но я заметил, что он дважды вызывал конструктор. Поэтому я добавил String в качестве возвращаемого параметра, после чего он прекратил вести себя таким образом. Я не уверен, почему он сутулый, и я также не уверен, почему он дважды вызывал конструктор, так как я наблюдал это в режиме отладки. Я уверен, что вы можете объяснить. Огромное спасибо. – Peter

+0

Hi BalusC, пожалуйста, несите мое невежество. Я не уверен, как отправить свой код с комментариями, поэтому я просто пытаюсь объяснить здесь. Все работает отлично, что находится в методе onRowSelect, за исключением того, что он открывает диалоговое окно «Загрузка файла» для MoreDetails вместо загрузки этой страницы. Я могу опубликовать свой код под новым сообщением, если вы захотите. Кроме того, мне еще нужно f ViewParm в моем MoreDeatl xhtml? Благодарю. – Peter

+0

Пример в моем ответе предполагает, что вы сопоставили 'FacesServlet' в шаблоне URL' * .xhtml'. Если вы сопоставили его с другим шаблоном URL-адреса, например '* .jsf', вы должны, естественно, изменить URL-адрес переадресации. Например. 'MoreDetai.jsf' вместо' MoreDetail.xhtml' (или лучше, измените шаблон URL на '* .xhtml', чтобы вам никогда не приходилось возиться с виртуальными URL-адресами). – BalusC

Смежные вопросы