在渲染属性中使用#{param}时,p:commandLink不起作用

时间:2013-05-21 23:46:27

标签: jsf primefaces param commandlink rendered-attribute

我有一个页面显示一些个人资料,因此它是网址../faces/savedProfile.xhtml?profileId=1234

在该页面上,我有一个p:窗格,其中包含一些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 个答案:

答案 0 :(得分:1)

rendered属性不仅在HTTP请求期间进行评估,该请求返回带有命令链接的页面,但在命令链接发起的HTTP请求期间也会对其进行评估。显然,您在HTTP请求期间没有保留请求参数,导致rendered属性评估false,因此无法识别单击的命令链接,因此其动作事件将永远不会排队。

这符合commandButton/commandLink/ajax action/listener method not invoked or input value not updated的第5点。

您的案例中的解决方案是添加<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}">

另见: