1

我有一个页面显示一些个人资料,所以它是 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?

4

1 回答 1

1

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

这匹配commandButton/commandLink/ajax action/listener method not invoked 或 input value not updated的第 5 点。

您的情况的解决方案是添加<f:param>以保留请求参数:

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

与具体问题无关,更好地使用whichempty代替!= nullwhich 也将覆盖空字符串:

<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}">

也可以看看:

于 2013-05-22T12:27:47.037 回答