为什么禁用按钮不起作用?

时间:2012-10-05 16:51:07

标签: jsf-2

我看到了一个奇怪的缺陷。这是一个简单的测试用例。

托管bean是:

@ManagedBean
public class Controller {
    private int counter = 0;
    //getter and setters...
    public String next() {
        ++counter;
        return null;
    }
    public String prev() {
        --counter;
        return null;
    }
}

观点是:

<h:form>
<p>Value: #{controller.counter}</p>
<h:inputHidden value="#{controller.counter}" />
<h:commandButton action="#{controller.prev()}" value="Previous" disabled="#{controller.counter == 0}"/>
<h:commandButton action="#{controller.next()}" value="Next"     disabled="#{controller.counter == 5}"/>
</h:form>

首次显示视图时,将禁用“上一步”按钮。单击“下一步”时,“上一步”按钮将启用。到现在为止还挺好。但是,当我单击Previous按钮时,动作处理程序方法prev()永远不会被调用。如果我删除按钮的禁用属性,那么一切正常。我做错了什么还是Mojarra有缺陷?我正在使用JBoss 7.1和M​​ojarra。感谢。

1 个答案:

答案 0 :(得分:0)

如果您的bean是请求作用域,并且您在构造期间(post)构建时没有基于请求参数预初始化counter属性,则会发生这种情况。这样,当JSF即将应用请求值时,该按钮仍处于禁用状态。作为防范篡改/被黑客入侵请求的一部分,JSF将不会对动作事件进行排队。

将bean放在视图范围中,或者确保根据请求参数正确预先初始化(post)构造函数中的关联属性应该修复它。你所拥有的<h:inputHidden>在这个结构中完全没有任何价值。如果你将bean视图作为范围,只需摆脱它。如果您想坚持请求范围,请在两个按钮中将其替换为<f:param>,然后使用@ManagedProperty进行设置。

另见: