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

时间:2012-11-22 03:47:02

标签: jsf-2

我想检查某人是否有权限,以便他们可以查看我的链接,但我不明白为什么当我点击“查看”链接时,它将消失该链接并且不会处理我的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"/>

1 个答案:

答案 0 :(得分:2)

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

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

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

或者,您也可以将bean放在视图范围中,这样只要您与同一视图交互,bean实例就会存在,但在taghandlers中使用时又会产生另一个问题。因此,当您想要使用视图范围时,您肯定必须用JSF组件的rendered属性替换JSTL测试。

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

<h:commandLink value="View" action="#{controller.prepareView}" rendered="#{controller.viewMode == 'OK'}" />

另见: