清除/重置表单时禁用bean验证

时间:2011-11-26 10:32:42

标签: jsf-2 bean-validation

CASE:表单包含输入部门名称的输入文本(不能为空或空白),下拉列表用于选择父部门(可以为空),输入数据时,按清除,清除方法backing bean按预期正常工作,但是当没有输入数据并按下clear时,名称上的bean验证非空白并且出现验证消息,我想在清除时禁用验证。

  1. 查看代码


                 部门名称:                       

    <h:outputLabel>Parent Department:</h:outputLabel>
        <ice:selectOneMenu id="parentDepartment" value="#{department.selectedParentDepartment}">               
          <f:selectItem/>
          <f:selectItems value="#{departmentBean.departmentList}" var="dept" 
           itemLabel="#{dept.name}" itemValue="#{dept.id}" />                            
        </ice:selectOneMenu> 
        <h:message for="parentDepartment" style="color:red" />        
    
    <ice:panelGroup>
        <h:commandLink value="Add New" action="#{departmentBean.addOrUpdateDepartment}" />
        <h:commandLink value="Add New" actionListener="#{departmentBean.clear}" />
    </ice:panelGroup>
    

  2. Bean验证

    @NotBlank(message = "{name.required}") @Size(max = 25, message = "{long.value}") @Column(name = "name", length = 25, nullable = false) private String name;

  3. Backing Bean方法

    public void clear() { setDepartmentObj(new Department()); setSelectedParentDepartment(0); }

2 个答案:

答案 0 :(得分:6)

您可以让它刷新整个视图:

<h:commandLink value="Clear" action="#{bean.clear}" immediate="true" />

public String clear() {
    return FacesContext.getCurrentInstance().getViewRoot().getViewId() + "?faces-redirect=true";
}

immediate="true"将跳过没有immediate="true"的所有输入组件的处理(和验证)。

或者,重新加载页面的JavaScript也应该这样做:

<h:commandLink value="Clear" onclick="window.location.reload(); return false;" />

根据您想要部分请求的评论

更新,然后只使用ajax:

<h:commandLink value="Clear" action="#{bean.clear}">
    <f:ajax execute="@this" render="@form" />
</h:commandLink>

public void clear() {
    field1 = null;
    field2 = null;
    // ...
}

由于execute设置为@this(顺便说一下,它已经是默认值,因此您可以省略它),因此它不会处理整个表单。

答案 1 :(得分:0)

某些组件有valueChangeListener。尝试使用那个。但是我不确定是否会触发验证。