2012-03-28 90 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