如何在验证失败时更改输入字段和标签的css类?

时间:2013-01-22 06:11:56

标签: css validation jsf facelets highlight

假设我有一个要验证的用户名,在这种情况下,当验证失败并显示错误消息时,我需要以红色显示用户名outputText和用户名inputText字段。

我尝试在面板组中绑定所有这些,以便在验证失败时,所有字段都应该受到影响。但只是放置panelgroup不起作用。

我的支持bean验证器

public void emailValidate(FacesContext context,
        UIComponent componentToValidate,
        Object value)
        throws ValidatorException {


    String email = value.toString();


    if (!Validator.isEmailAddress(email))
    {
        FacesMessage message =
                new FacesMessage(FacesMessage.SEVERITY_ERROR,"Email","Please enter valid email address");
                throw new ValidatorException(message);
    }


}

我的Jsf

<h:panelGroup>
<h:outputText value="Email"/>
<h:message for="emailInput/>
<h:inputText id="emailInput" value="#{mybean.email}" validator="#{mybean.emailValidate}"/>
</h:panelGroup>

2 个答案:

答案 0 :(得分:8)

通过binding属性将输入组件绑定到视图。它将在EL中作为UIInput组件引用提供,以便您可以在styleClass属性中使用UIInput#isValid()

<h:outputLabel for="emailInput" value="Email" 
    styleClass="#{emailInput.valid ? '' : 'error'}" />

<h:inputText id="emailInput" binding="#{emailInput}" ... 
    styleClass="#{emailInput.valid ? '' : 'error'}" />

(请注意,我已将您的标签修改为真实标签;另请注意,根据cubbuk的回答,您根本不需要创建一些bean属性)< / em>的

是的,这可能会在视图中产生一些非DRY样板代码。您可以使用phase listener或系统事件侦听器来抽象它。您还可以使用OmniFaces <o:highlight>组件,它可以透明地完成所有工作。另请参阅live demo

答案 1 :(得分:1)

您需要一个字段来表示辅助bean中的验证失败。根据验证字段的条件,您可以更改uiComponents的css,如下所示。

public void emailValidate(FacesContext context,
                UIComponent componentToValidate,
                Object value)
                throws ValidatorException
    {
       String email = value.toString();
       if (!Validator.isEmailAddress(email))
            {
                FacesMessage message =
                        new FacesMessage(FacesMessage.SEVERITY_ERROR, "Email", "Please enter valid email address");
                validationFailed = true;
                throw new ValidatorException(message);
            }
    }

public Boolean getValidationFailed()
{
    return validationFailed;
}

<style>
   .errorClass
   {
       background-color: red;
   }
   </style>
   <h:panelGroup>
      <h:outputText value="Email" styleClass="#{ozetPageBean.validationFailed ? 'errorClass' : ''}"/>
      <h:message for="emailInput"/>
      <h:inputText id="emailInput" 
                   value="#{ozetPageBean.email}" 
                   validator="#{ozetPageBean.emailValidate}"
                   styleClass="#{ozetPageBean.validationFailed ? 'errorClass' : ''}"/>
   </h:panelGroup>