0

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

1 回答 1

2

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

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

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

或者,您也可以将 bean 放在视图范围内,这样只要您与同一个视图交互,bean 实例就会一直存在,但是在标记处理程序中使用时又会出现另一个问题。所以当你想使用视图范围时,你肯定必须用renderedJSF 组件的属性来替换 JSTL 测试。

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

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

也可以看看:

于 2012-11-22T10:50:16.513 回答