Validate input as required only if certain command button is pressed

懵懂的女人 提交于 2019-12-20 13:19:28

问题


I have specific use case for JSF validation. For example I have an inputText field:

<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>

Value of input is number (in some cases it can also be a string, because this is part of composite component, but problem is better described if we assume this is a number). This input is part of the form, at the end of form I have submit button:

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

What are my requests:

  1. When submit button is pressed all validation should be processed and this is OK, this works fine.
  2. When blur event is fired on input field if field is not empty a number validation should be processed, and this is also OK. At the end I update field with id name with some value.
  3. Now I have a problem. My third request is when input is empty validation on input should not be processed. This is special case in which I will clear field with id name. This is also case when i remove text which is already entered in input, remove focus from component (press TAB for example) and in that case AJAX request should also be processed and name input will also be cleared.

How I can disable validation of this input field in case when it is empty, and just for this ajax event?


回答1:


Let the input's required attribute check if the save button is pressed or not (which can be identified by the presence of its client ID in the request parameter map).

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

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

(note: do not bind it to a bean property! the code is as-is)

This way it would only evaluate true when the save button is actually pressed.

Or, if you have problems with binding and/or don't have a problem hardcoding the button's client ID:

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

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



回答2:


Just remove the required attribute as you accept the input if the input is empty. Then write a custom validator which accepts only empty input or numerical input.

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

}



来源:https://stackoverflow.com/questions/14729982/validate-input-as-required-only-if-certain-command-button-is-pressed

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!