如何处理JSF中的问题,哪些值未提交给最初被标记为已禁用的字段?

时间:2012-03-22 20:38:49

标签: jsf-2

我的支持bean是Request Scoped的页面上有两个下拉列表。首次呈现页面时,始终禁用第二个下拉列表。但是,如果用户将第一个下拉列表切换为与默认值不同的值,则启用第二个下拉列表。当用户提交表单时,我希望我的RequestScoped托管bean看到第二个下拉列表的值。但是,显然,由于第二次下拉最初被禁用,其值不会随表单一起提交,即使提交表单时,也会启用下拉列表。

我解决这个问题的方法是将第二个下拉列表的禁用“状态”存储在ViewScoped bean中。这样,当用户将第一个下拉列表更改为默认值以外的值时,actionListener可以触发,它将更新与第二个下拉列表关联的ViewScoped bean的值(将其状态更改为未禁用)。

这是处理这种情况的最佳方法吗?或者,还有更好的方法?

2 个答案:

答案 0 :(得分:2)

这确实是最理智的方法。

另一种方法是,如果确实需要将bean放在请求范围内,则需要重新确定(post)构造函数中第二个下拉列表的disabled状态。 bean基于您在request parameter map中可以找到的第一个下拉列表的提交值(或者让JSF通过@ManagedProperty设置它)。如有必要,您只需手动重复JSF转换/验证。

假设当第一个下拉列表的提交值等于字符串值foo并且第一个下拉列表的客户端ID为form:dropdown1时,不应再禁用第二个下拉列表:

public Bean() {
    this.dropdown2disabled = !"foo".equals(FacesContext.getCurrentInstance()
        .getExternalContext().getRequestParameterMap().get("form:dropdown1"));
}

但是当你发现时,视图范围的bean更容易。

作为另一种替代方法,您可以使用Tomahawk's <t:saveState>直接在视图状态中存储单个属性。然后将其添加到视图中:

<t:saveState value="#{bean.dropdown2disabled}" />

与使用视图范围的bean相比,这将导致视图状态的小小。

答案 1 :(得分:0)

我有类似的问题。我最终使用“假”禁用来解决它。

<div style="position:relative">
    <p:inputText styleClass="ui-state-disabled">

    <!-- fake-disable input field -->
    <div style="position:absolute; top:0; left:0; width:100%; height:100%;"/>
</div>

在输入上方使用不可见的div,用户无法与其进行交互。另外,我设置了输入字段的样式,使其看起来已禁用。