Не работает 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?


person user1801069    schedule 21.05.2013    source источник
comment
Можете ли вы добавить <h:messages> где-нибудь на странице? Я считаю, что фаза проверки JSF по какой-то причине не прошла.   -  person Konstantin Yovkov    schedule 22.05.2013
comment
Пожалуйста, обратитесь к h:commandLink/h:commandButton не вызывается и просмотрите наиболее распространенные причины, которые могут привести к тому, что ваш UICommand неудача. После этого проверьте сгенерированный HTML, чтобы увидеть, есть ли у вас вложенные формы или другая проблема с HTML. Обратите внимание, что с текущей информацией трудно понять возможную причину вашей точной проблемы.   -  person Luiggi Mendoza    schedule 22.05.2013


Ответы (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> в сочетании с bean-компонентом с областью видимости (и преобразователем Profile):

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

с

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

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

person BalusC    schedule 22.05.2013
comment
Я добавил ‹f:param›, и он работает как шарм. Но поскольку на этой странице у меня будут другие ссылки на команды, использование ‹f:viewParam› поможет еще больше. Спасибо! - person user1801069; 22.05.2013