2012-01-20 20 views
1

我有一個奇怪的問題,我一直試圖解決一段時間,但我被困在一個地方,不太明白這裏發生了什麼。無法使用JSF表達式值設置託管屬性參數

我的索引頁看起來是這樣的:

<h:selectOneMenu id="selectMenu" value="#{indexBean.model.selected_id}" styleClass="indexItems"> 
    <f:selectItems value="#{indexBean.myModelValues}" />  
    <a4j:support event="onchange" reRender="peek" />   
</h:selectOneMenu> 
<br> 
<h:outputText id="peek" value ="#{indexBean.model.selected_id}"/> 
<br> 
<a4j:commandButton value="Go to Form" action="form" styleClass="indexItems"> 
    <f:param name="selected" value="#{indexBean.model.selected_id}" />          
</a4j:commandButton> 

命令按鈕會將用戶帶到下一個頁面時,我想從selectOneMenu用於選定的位置。問題是什麼都沒有發送。當我從Menu中選擇一些值時,'peek'outputText被正確地重新渲染,我可以看到正確的選擇。但是它不會被髮送到下一頁和Bean。令人驚訝的是,當我將參數的值更改爲固定字符串時,它的工作原理!因此,即:

<f:param name="selected" value="someValue1" /> 

在下一個Bean中正確讀取!所有的bean都被請求作用於RichFaces @KeepAlive註解的範圍(我嘗試了沒有註釋並且它是相同的)。 IHAVE treied: - 改變A4J:命令按鈕來H:commandLink或h:outputLink的 - 改變indexBean.model.selected_id到indexBean.selected_id - 最後改變從h輸入源:selectOneMenu用於到h:inputText的

沒有什麼幫助 - 它仍然是相同的 - 一個硬編碼的字符串被正確地傳遞到下一頁,但是當我嘗試使用表達式時,參數總是空的。

我在這裏發佈faces-config.xml中的一個片段:

<managed-bean> 
    <managed-bean-name>indexBean</managed-bean-name> 
    <managed-bean-class>id.webapp.beans.IndexBean</managed-bean-class> 
    <managed-bean-scope>request</managed-bean-scope> 
</managed-bean> 
<managed-bean> 
    <managed-bean-name>model</managed-bean-name> 
    <managed-bean-class>id.webapp.beans.Model</managed-bean-class> 
    <managed-bean-scope>request</managed-bean-scope> 
</managed-bean> 
<managed-bean> 
    <managed-bean-name>formBean</managed-bean-name> 
    <managed-bean-class>id.webapp.beans.FormBean</managed-bean-class> 
    <managed-bean-scope>request</managed-bean-scope> 
    <managed-property> 
     <property-name>selectedValue</property-name> 
     <value>#{param.selected}</value> 
    </managed-property> 
</managed-bean> 

沒有任何一個有一個想法,爲什麼這不起作用?我已經使用過去那樣的託管屬性參數,它的工作原理(意思是使用一些動態更改的值而不是靜態字符串)。

回答

1

<f:param>在初始請求期間(當表單將被顯示時)被評估,而不是在表單提交請求期間被評估。所以它仍然是初始值,而不是改變的值。

<a4j:commandButton>一個id並在reRender中也參考它,以便在按下按鈕之前重新評估它的<f:param>

<h:selectOneMenu id="selectMenu" value="#{indexBean.model.selected_id}" styleClass="indexItems"> 
    <f:selectItems value="#{indexBean.myModelValues}" />  
    <a4j:support event="onchange" reRender="peek,button" />   
</h:selectOneMenu> 
<br> 
<h:outputText id="peek" value ="#{indexBean.model.selected_id}"/> 
<br> 
<a4j:commandButton id="button" value="Go to Form" action="form" styleClass="indexItems"> 
    <f:param name="selected" value="#{indexBean.model.selected_id}" />          
</a4j:commandButton> 
+0

BalusC:謝謝你的工作。我只重新編輯了outputText以查看selectOneMenu是否正確地賦值。但是現在我發現實際上需要正確傳輸參數。感謝您的貢獻。 –

+0

不客氣。 – BalusC

+0

我不知道是否仍有機會回答,但我現在只注意到這個解決方案存在一個問題 - 只有在selectOneMenu中的值實際發生更改時纔會起作用。如果不會更改(即用戶決定第一個默認選項),則該屬性不會被設置。我可以用selectOneMenu的第一個值初始化參數(這些值是動態填充的,所以不能硬編碼)。 –