在下拉列表中更改选择时,避免输入字段的required = true约束

时间:2011-02-11 19:39:04

标签: validation jsf selectonemenu

我有一个下拉列表,旁边有一个文本字段。基于下拉列表中选择的值,我正在更改文本字段的类型,例如将其更改为日期,整数,文本。这些文本字段的必需属性设置为true。

因此,当我在下拉列表中选择不同的值时,我可以更改文本字段的类型,但我也会在文本字段中收到必需的错误消息。我怎么能避免这个?

我正在使用JSF 1.2。

<h:selectOneMenu id="SelectField"  
    value="#{logSearchBean.searchType}"    
    onchange="this.form.submit();"
    valueChangeListener="#{logSearchBean.searchValueType}" >
    <f:selectItems  value="#{logSearchBean.columnDesc}" />
</h:selectOneMenu>

<h:inputText id="SearchText"
    value="#{logSearchBean.searchValue}"
    required="true"
    requiredMessage="Please provide value to Search for"
    rendered="#{logSearchBean.searchValueEditor eq 'SearchText'}"/>

<t:inputDate id="SearchDate"
    value="#{logSearchBean.searchValueDate}"
    popupCalendar="true"
    required="true"
    requiredMessage="Please provide value to Search for"
    rendered="#{logSearchBean.searchValueEditor eq 'SearchDate'}"/>

1 个答案:

答案 0 :(得分:1)

你需要做两件事:

  1. immediate="true"添加到下拉列表中。

    <h:selectOneMenu immediate="true">
    

    这将导致在应用请求值阶段而不是验证阶段调用valueChangeListener方法。因此,它将比平时更早地调用一个阶段,并且此时尚未处理没有immediate="true"的所有其他输入字段。

  2. 在与下拉列表相关联的valueChangeListener方法中,请致电FacesContext#renderResponse()

    FacesContext.getCurrentInstance().renderResponse();
    

    这将指示JSF绕过所有剩余阶段,直到渲染响应阶段。因此,不再处理没有immediate="true"的其他输入字段。