我为我的项目创建了一个自定义验证器,它只是检查选择的值并'验证'值不是'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调用
非常感谢任何帮助!
答案 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.">