2013-02-06 46 views
8

我有JSF验证的特定用例。例如我有一个inputText字段:仅当按下某个命令按钮时才根据需要验证输入

<p:inputText id="input" required="#{myBean.required}" value="#{myBean.value}" maxlength="20" disabled="#{myBean.disabled}"> 
    <p:ajax event="blur" process="@this" update="name" listener="#{myBean.listener}"/> 
</p:inputText> 

输入的值是数字(在某些情况下它也可以是一个字符串,因为这是复合部件的一部分,但问题是更好地描述,如果我们假设这是一个数)。此输入形式的一部分,在表格的最后,我有提交按钮:

<p:commandButton value="Save" actionListener="#{myBean.save}"/> 

什么是我的要求:

  1. 当提交按钮被按下时所有的验证应该进行处理,这是OK ,这工作正常。
  2. 如果字段不为空时在输入字段上触发模糊事件,则应处理数字验证,这也是可以的。最后,我更新了ID为name的字段并提供了一些值。
  3. 现在我有一个问题。我的第三个请求是当输入为空时,不应处理输入验证。这是特殊情况,我将清除ID为name的字段。当我删除已经在输入中输入的文本,从组件中移除焦点(例如按TAB)时,也是这种情况,并且在这种情况下AJAX请求也应该被处理并且名称输入也将被清除。

如何禁用验证此输入字段的情况下,当它是空的,只为这个Ajax事件?

回答

10

让输入的required如果被按下保存按钮属性检查(其可以通过其客户端的存在来鉴定请求参数映射中的ID)。

<h:form> 
    <p:inputText ... required="#{not empty param[save.clientId] and myBean.required}" /> 

    <p:commandButton binding="#{save}" ... /> 
</h:form> 

(注:做将其绑定到一个bean属性的代码是不变化)

这样,它只会评价true当保存按钮被按下实际。

或者,如果你有binding问题和/或没有硬编码按钮的客户端ID的问题:

<h:form id="formId"> 
    <p:inputText ... required="#{not empty param['formId:buttonId'] and myBean.required}" /> 

    <p:commandButton id="buttonId" ... /> 
</h:form> 
+0

您认为在这种情况下所需的验证会被忽略?为什么? – partlov

+0

只要你不填充(并因此改变)输入,验证不会在模糊时被触发。 – BalusC

+0

也许我对第三个请求中的具体用例还不清楚。我编辑它。用户可能(可能意外地)删除文本,并在这种情况下名称输入将被清除。 – partlov

2

只要在输入为空时接受输入,就删除所需的属性。然后编写一个只接受空输入或数字输入的自定义验证器。

<p:inputText id="input" value="#{myBean.value}" maxlength="20" disabled="#{myBean.disabled}" validator="customerNumericInputValidator"> <p:ajax event="blur" process="@this" update="name" listener="#{myBean.listener}"/> </p:inputText> 

公共类customerNumericInputValidator实现验证{

@Override 
public void validate(FacesContext facesContext, UIComponent uIComponent, 
     Object object) throws ValidatorException { 

    String number = (String) object; 
    number = Strings.nullToEmpty(number).trim(); 

    //if the request is a full request then number can not be empty 
    if(!FacesContext.getCurrentInstance().isPostback() && Strings.isNullOrEmpty(number)) 
    { 
     FacesMessage message = new FacesMessage(); 
     message.setSummary(Messages.getMessage("error empty value")); 
     message.setSeverity(FacesMessage.SEVERITY_ERROR); 
     throw new ValidatorException(message); 
    } 

    if(!Strings.isNullOrEmpty(number)) 
    { 
     if(!isNumber(number)) 
     { 
      FacesMessage message = new FacesMessage(); 
      message.setSummary(Messages.getMessage("error not numerical value")); 
      message.setSeverity(FacesMessage.SEVERITY_ERROR); 
      throw new ValidatorException(message); 
     } 
    } 
} 

}

+0

,但需要验证应该情况下的形式与'commandButton'提交处理。 – partlov

+0

当使用commandButton提交表单时,您的customValidator也会被执行,如果输入的值不是数字,它将抛出异常;但是如果输入是空的,它不会抱怨。 – cubbuk

+0

好的,在请求1我写道,当表单提交按钮时,必须不要忽略!使用按钮提交时,我们可以说该字段是必需的,但在模糊事件上使用Ajax提交时不需要。 – partlov

相关问题