9

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

如果该输入字段为空,并且仅针对此 ajax 事件,如何禁用该输入字段的验证?

4

2 回答 2

12

让输入的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>
于 2013-02-06T13:48:39.340 回答
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>
public class customerNumericInputValidator implements Validator {

    @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);
            }
        }
    }

}
于 2013-02-06T13:21:17.423 回答