【发布时间】:2023-03-26 03:04:01
【问题描述】:
我为我的项目创建了一个自定义验证器,它只是检查选择的值并“验证”该值不是“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} 表达式是错误的。如果我然后更改 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 调用
非常感谢任何帮助!
【问题讨论】:
标签: ajax jsf validation