<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