Enable\Disable 命令按钮取决于 URL 参数

Enable\Disable commandbutton depending on URL parameter

JSF 2 允许使用 <f:viewParam> 标签初始化 URL 参数。

例如:

<f:viewParam id="name" name="name"
            value="#{applicationBean.name}" required="true" />

然后在支持 bean 中使用此参数来加载一些使用 <f:event> 的对象。

例如:

<f:event type="preRenderView"
            listener="#{applicationBean.preRenderView}" />

applicationBean 中的 preRenderView() 方法将一些布尔变量 buttonEnabled 设置为 true\false

在主页中将此变量用于 enable\disable 按钮时,它不起作用(例如,它始终计算为 false):

<h:commandButton disabled="#{!applicationBean.buttonEnabled}">

有什么建议吗?

出现计时问题。操作事件在应用请求值阶段排队。作为防止篡改请求的一部分,它还会在此时评估 disabled(和 rendered)属性。然而,由于它实际上只是在渲染响应阶段之前设置的,因此它确实总是会评估其默认值,这显然是 false.

您需要在 @PostConstruct 中执行基于请求参数的初始化作业(<f:viewParam> 确实不合适),或者让 disabled 属性检查请求参数本身而不是 bean 属性(bean 属性 确实不合适)。