2012-03-28 98 views
1

中的值在我的jsf应用程序中,我想验证一个字段,该字段只应在验证SelectOneRadio中的一个选项时进行验证。JSF 2.0;验证标签“禁用”取决于页面

我发现,<f:validator>有一个属性,称为“禁用”。

我可以使用它来检查另一个字段的值吗?

我试过了,但是我没有访问我的bean的值。

<h:selectOneRadio value="#{myBean.checkedSelectOneRadioValue}"> 
    <f:selectItems value="#{myBean.valuesForSelectOneRadio}" /> 
</h:selectOneRadio> 


<f:validator validatorId="myValidator" disabled="#{myBean.checkedSelectOneRadioValue == 'TEST'}" /> 

有没有办法在没有自己的验证处理程序的情况下达到这个目的?

谢谢!

+0

您的残疾外观检查几分怀疑,是不是应该#{myBean.checkedSelectOneRadioValue == 'TEST'}“或者它只是一个错字(移动大括号)吗? – Volker 2012-03-28 11:01:14

+0

我也试过你的版本,它不起作用。难道是在那个验证时刻,SelectOneRadio的值没有存储bean? – Tobi 2012-03-28 11:05:13

+0

尝试在selectOneRadio标签中设置partialSubmit =“true”,该标签应该取值 – Volker 2012-03-28 11:08:24

回答

0

为了避免评论扩展的讨论,我会提供我的建议作为一个答案,以进一步讨论此事。

起初,它应该是

disabled="#{myBean.checkedSelectOneRadioValue == 'TEST'}

disabled="#{myBean.checkedSelectOneRadioValue eq 'TEST'}

另外,至少在ICEFaces(和MyFaces应该有这个功能, O),你可以使用:

<h:selectOneRadio value="#{myBean.checkedSelectOneRadioValue}" partialSubmit="true"> <f:selectItems value="#{myBean.valuesForSelectOneRadio}" /> </h:selectOneRadio>

这应该改变selectoneradio和验证禁用值校验后迫使一个Ajax请求应该能够从bean得到它。

如果不行,可以自动提交或MyFaces的相似......

+0

不起作用:-(我试过用partialSubmit,用eq和==,但验证器不能像我期望的那样工作。至少,我试着将'TEST'设置为null,并且它工作。选定的值不会被写入到bean中。我可以使用valueChangeListener将值存储在bean中吗? – Tobi 2012-03-28 12:08:44

+0

您使用验证器?它是否有部分提交,立即或其他什么?新值是否写入到你的bean中,或者你的视图是否从它接收不到? – Volker 2012-03-28 12:14:49

+0

验证器在inputText中。是否还有partialSubmit属性? – Tobi 2012-03-28 12:21:45

0

随着JSF 2.0,你可以使用f:ajax对于部分提交。此标记添加到您的h:selectOneRadio

<h:selectOneRadio value="#{myBean.checkedSelectOneRadioValue}"> 
    <f:ajax render="idOfInputText"/> 
    <f:selectItems value="#{myBean.valuesForSelectOneRadio}" /> 
</h:selectOneRadio> 
... 
<h:inputText id="idOfInputText"> 
    <f:validator validatorId="myValidator" 
       disabled="#{myBean.checkedSelectOneRadioValue eq 'TEST'}" /> 
</h:inputText> 

更换render属性的内容与你的输入字段与验证真实身份识别码。这假定selectOneRadio和inputText在同一个NamingContainer内。

+0

我也试过这个例子,但它不起作用。现在我相信,这里有一些奇怪的事情: - /我必须使用绑定selectoneradio和/或inputtext? – Tobi 2012-03-28 13:05:06

+0

最后,我找到了一个解决方案。 我现在将在myBean中进行验证,并且所有操作都按预期工作。 感谢您的帮助! – Tobi 2012-03-28 13:32:42

6

<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 examplesource 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); 
      } 
     } 
    }); 
} 
+0

''让我的一天! – ForguesR 2016-12-09 17:36:29