Jsf 2 如何在c:if中使用h:commandLink

Jsf 2 如何在c:if中使用h:commandLink,jsf-2,Jsf 2,我想检查是否有人有权限查看我的链接,但我不明白为什么当我单击“查看”链接时,该链接将消失,并且不会处理我的prepareView()。怎么了 <c:if test="#{controller.viewMode == 'OK'}"> <h:commandLink action="#{controller.prepareView()}" value="View"/> </c:if> <h:commandLink action="#{controlle

我想检查是否有人有权限查看我的链接,但我不明白为什么当我单击“查看”链接时,该链接将消失,并且不会处理我的prepareView()。怎么了

<c:if test="#{controller.viewMode == 'OK'}">
    <h:commandLink action="#{controller.prepareView()}" value="View"/>
</c:if>
<h:commandLink action="#{controller.prepareEdit()}" value="Edit"/>
<h:commandLink action="#{controller.destroy()}" value="Delete"/>

{controller.viewMode}
后面的值取决于请求范围内的条件时,可能会发生这种情况,与表单显示请求相比,表单提交请求中的条件发生了不兼容的变化

在处理表单提交的还原视图阶段,将再次重新评估
。如果
#{controller.viewMode}
此时返回的不是“OK”(即使它在表单显示的初始请求期间返回),则命令链接将在组件树中消失。它的行动将永远不会被解码或调用

要解决此问题,您需要确保
#{controller.viewMode}
在回发请求期间返回的值与在初始请求期间返回的值完全相同。如果bean是请求范围的,那么基本上需要确保该属性在请求范围bean的(post)构造函数中正确初始化

或者,您也可以将bean放在视图范围中,这样bean实例将在您与同一视图交互时一直存在,但在标记处理程序中使用时,这反过来又有另一个问题。因此,当您想要使用视图范围时,您肯定必须用JSF组件的
rendered
属性替换JSTL测试

@ManagedBean
@ViewScoped
public class Controller {
    // ...
}


另见:

为了更加一致,我建议使用一些不同的
编码方式,以避免JSTL和JSF的混合。您可以发布bean
控制器吗?@JScoobyCed:上次您发送答案时,我已经在h:commandLink中通过put-rendered=“#{Controller.viewMode='OK'}”对其进行了测试。但我的“视图”链接消失的问题仍然存在occurred@Auilo:我的控制器很长,我认为问题与控制器无关Hanks JScoobyCed,您的解决方案正确。当Auilo向我询问控制器时,我再次检查,发现我没有保存我的参数:-)。再次感谢大家的支持汉克斯·巴卢斯克:非常感谢,你的信息非常清楚,对我很有用。
<h:commandLink value="View" action="#{controller.prepareView}" rendered="#{controller.viewMode == 'OK'}" />