Не работает p:commandLink при использовании #{param} в отображаемом атрибуте

У меня есть страница с некоторым профилем, так что это URL ../faces/savedProfile.xhtml?profileId=1234,

На этой странице у меня есть p: pane, содержащая несколько компонентов p: commandLink, примерно так:

<p:panel rendered="#{profileController.canViewProfile}">
...
    <p:commandLink 
        id="duplicateLink"
        value="Duplicate"
        action="#{profileController.duplicateProfile}"/>
...
</p:panel>

Оно работает. Теперь я хочу добавить еще одно условие рендеринга:

<p:panel rendered="#{profileController.canViewProfile
        and param['profileId'] != null}">
...
    <p:commandLink 
        id="duplicateLink"
        value="Duplicate"
        action="#{profileController.duplicateProfile}"/>
...
</p:panel>

Отображается p: commandLink, но он не активен. Кажется, что метод действия не вызывается при клике. Почему это дополнительное условие рендеринга убивает commandLink?

1 ответ

rendered Атрибут оценивается не только во время HTTP-запроса, который возвращает страницу со ссылкой на команду, но также и во время HTTP-запроса, инициируемого ссылкой на команду. Видимо, вы не сохраняете параметр запроса во время этого HTTP-запроса, который вызывает rendered атрибут оценивает false и, таким образом, ссылка на нажатую команду не может быть идентифицирована, и, следовательно, ее событие действия никогда не будет поставлено в очередь.

Это соответствует пункту 5 метода commandButton/commandLink/ajax action/listener, который не вызывается, или входное значение не обновляется.

Решение в вашем случае заключается в добавлении <f:param> сохранить параметр запроса:

<p:commandLink ...>
    <f:param name="profileId" value="#{param.profileId}" />
</p:commandLink>

Не связано с конкретной проблемой, лучше использовать empty вместо != null который будет также покрывать пустые строки:

<p:panel rendered="#{profileController.canViewProfile and not empty param.profileId}">

Или намного лучше, используйте <f:viewParam> в сочетании с фасолью видимости (и Profile конвертер):

<f:viewParam name="profileId" value="#{profileController.profile}" />

с

<p:panel rendered="#{profileController.canViewProfile and not empty profileController.profile}">

Смотрите также:

Другие вопросы по тегам