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