时间:2011-09-13 16:00:06

标签: ajax jsf validation

我为我的项目创建了一个自定义验证器,它只是检查选择的值并'验证'值不是'0'。我们有一个标准(我肯定并不罕见)手动设置我们的selectOneMenu竞争对手的第一个值:

<f:selectItem itemValue="0"
              itemLabel="-- Select One --"/>

哪种方法正常,但随后使组件始终通过所需的检查。因此,此验证器只是将此值视为没有进行选择。

SelectOneMenu示例:

<h:selectOneMenu id="eligibility"
             value="#{reg.eligibility}"
             required="#{reg.fieldsRequired}">
<f:selectItem itemValue="0"
              itemLabel="-- Select One --"/>
<f:selectItems value="#{reg.eligibilityList}" />
<f:validator validatorId="selectOneValidator"
             disabled="#{!reg.fieldsRequired}"/>

自定义验证器:

@FacesValidator("selectOneValidator")

公共类SelectOneValidator实现Validator {

@Override
public void validate(FacesContext context, UIComponent uiComponent, Object o) throws ValidatorException {
    String val = null;
    if (uiComponent instanceof HtmlSelectOneMenu) {
        HtmlSelectOneMenu oneMenu = (HtmlSelectOneMenu) uiComponent;


        if (oneMenu.isRequired() && !oneMenu.isDisabled()) {
            if (o instanceof String) {
                val = (String) o;
            } else if (o instanceof Number) {
                val = String.valueOf(o);
            }

            if ("0".equals(val)) {
                FacesMessage msg = new FacesMessage();
                msg.setSummary("Please select a value from the list.");
                msg.setSeverity(FacesMessage.SEVERITY_ERROR);
                throw new ValidatorException(msg);
            }
        }
    }
}

}

到目前为止,这已经很好了,但是,目前的用例我遇到了麻烦。 我的页面有多个SelectOneMenus,其中一个通过页面的ajax调用切换必需和禁用的属性。但是,我对required="#{reg.fieldsRequired}"没有任何问题;我的自定义验证器上的disabled="#{!reg.fieldsRequired}"属性似乎没有什么区别。我只是大声思考,但是当页面首次加载时,#{reg.fieldsRequired}表达式为false。如果我然后更改SelectOneMenu将此布尔值设置为true,则按提交按钮,似乎似乎没有设置disabled属性。我想知道这是否只是一个ajax问题,并且所有组件都需要重新渲染,所以我在我的ajax调用中添加了@form:<a4j:ajax render="@form" listener="#{reg.saveActionChanged}"/>希望能解决问题,但没有区别行为。

环境:
JSF 2.0.3
Tomcat 6.0.14
使用RichFaces 4.0进行ajax调用

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

抱歉,我无法使用JSF 2.1.3重现您的问题。 <f:validator disabled>按预期工作。

但是,作为一种完全不同的替代方案,您可以在这种特殊情况下使用标准required验证器。您只需将项目值设置为#{null}而不是0

<f:selectItem itemValue="#{null}" itemLabel="-- Select One --"/>

这样您就不需要自定义验证器了。消息可以设置为输入组件的requiredMessage属性。

<h:selectOneMenu requiredMessage="Please select a value from the list.">