<f:validator>
是一个标记处理程序,而不是一个UI组件。其所有属性都是在视图构建时间期间评估的每个定义,而不是在视图渲染时间期间评估的视图构建时间是当XHTML文件被解析成如context.getViewRoot()
所提供的JSF组件树的那一刻。通过在(ajax)操作中返回null
/void
,通常可以在回传中重复使用完全相同的视图。
因此,您不能让标记处理程序属性依赖于在回发请求期间可以更改的呈现时间属性。其中一种方法是在自定义验证器本身内执行该检查。
E.g.
<h:inputText>
<f:validator validatorId="myValidator" />
<f:attribute name="radio" value="#{myBean.checkedSelectOneRadioValue}" />
</h:inputText>
与
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
if (!"TEST".equals(component.getAttributes().get("radio"))) {
return;
}
// Perform actual validation here.
}
您也可以也可以使用OmniFaces<o:validator>
代替。它将标准<f:validator>
扩展为属性中基于EL的评估。
<h:inputText>
<o:validator validatorId="myValidator" disabled="#{bean.checkedSelectOneRadioValue == 'TEST'}" />
</h:inputText>
参见从相关的提取物下面贴的showcase example和source code:
@Override
public void apply(FaceletContext context, UIComponent parent) throws IOException {
if (!ComponentHandler.isNew(parent)) {
return;
}
final javax.faces.validator.Validator validator = createValidator(context);
final RenderTimeAttributes attributes = collectRenderTimeAttributes(context, validator);
final ValueExpression disabled = getValueExpression(context, "disabled", Boolean.class);
((EditableValueHolder) parent).addValidator(new javax.faces.validator.Validator() {
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
if (disabled == null || Boolean.FALSE.equals(disabled.getValue(context.getELContext()))) {
attributes.invokeSetters(context.getELContext(), validator);
validator.validate(context, component, value);
}
}
});
}
您的残疾外观检查几分怀疑,是不是应该#{myBean.checkedSelectOneRadioValue == 'TEST'}“或者它只是一个错字(移动大括号)吗? – Volker 2012-03-28 11:01:14
我也试过你的版本,它不起作用。难道是在那个验证时刻,SelectOneRadio的值没有存储bean? – Tobi 2012-03-28 11:05:13
尝试在selectOneRadio标签中设置partialSubmit =“true”,该标签应该取值 – Volker 2012-03-28 11:08:24