p:commandLink — получить действие от контроллера

У меня есть p:commandLink и я хотел бы сделать так, чтобы контроллер определял свое действие на основе параметра.

Вот что у меня есть:

<p:commandLink 
    action="#{controller.getAction(rownum)}" 
    title="Go"
    styleClass="ui-icon ui-icon-refresh centered" 
    ajax="false"
    disabled="#{controller.isLinkDisabled(rownum)}">

    <f:param name="controllerId" value="#{otherController.getId()}" />

</p:commandLink>

rownum — это rowIndexVar из p:dataTable, в которых находится кнопка.

Метод контроллера:

public String getAction(Integer id) {
    if(id == 0) {
        LOG.info("Id is 0"); //LOG is a log4j logger
        return "toDestinationOne";
    } else {
        LOG.info("Id is not 0");
        return "toDestinationTwo";
    }
}

Это не работает.

Если я нажму кнопку в первой строке dataTable, то в логе увижу

Id is 0

Так что это означает, что метод вызывается правильно, но по какой-то причине он игнорирует возвращаемое значение, страница просто обновляется, меня не перенаправляют на новую страницу.

Обе строки находятся в faces-config.xml:

<navigation-case>
    <description>To destination one</description>
    <from-action>toDestinationOne</from-action>
    <from-outcome>toDestinationOne</from-outcome>
    <to-view-id>/pages/destinationOne.xhtml</to-view-id>
</navigation-case>
<navigation-case>
    <description>To destination two</description>
    <from-action>toDestinationTwo</from-action>
    <from-outcome>toDestinationTwo</from-outcome>
    <to-view-id>/pages/destinationTwo.xhtml</to-view-id>
</navigation-case>

Если я прямо поставлю значение вместо этого, оно будет работать правильно.

Я имею в виду, это:

<p:commandLink 
    action="toDestinationOne" 
    title="Go"
    styleClass="ui-icon ui-icon-refresh centered" 
    ajax="false"
    disabled="#{controller.isLinkDisabled(rownum)}">

    <f:param name="controllerId" value="#{otherController.getId()}" />

</p:commandLink>

Работает правильно, меня успешно перенаправляют на нужную страницу.

Итак, есть ли способ заставить commandLink следовать за action, возвращаемым методом getAction?


person BackSlash    schedule 28.08.2014    source источник


Ответы (1)


В вашем случае действие from должно совпадать с атрибутом действия commandLink.

#{controller.getAction(rownum)}
person dunni    schedule 28.08.2014
comment
#{controller.getAction(rownum)} относится к методу, который может возвращать два разных действия, это не строка действия... - person BackSlash; 28.08.2014
comment
Я имею в виду вот этот: ‹p:commandLink action=#{controller.getAction(rownum)} - person dunni; 28.08.2014
comment
Примечание (для BackSlash): метод getAction() возвращает два разных результата. Не путайте это с двумя разными действиями. - person Gimby; 28.08.2014
comment
@Gimby Да, я не знал, что это можно сделать таким образом. Спасибо вам обоим! :) - person BackSlash; 28.08.2014