1

我有一个奇怪的问题,我一直试图解决一段时间,但被困在一个地方,不太明白这里发生了什么。

我的索引页面如下所示:

<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 中获取所选位置时,commandButton 会将用户发送到下一页。问题是没有发送任何内容。当我从菜单中选择一些值时,'peek' outputText 会正确重新呈现,我可以看到正确的选择。但是它不会发送到下一页和 Bean。令人惊讶的是,当我将参数的值更改为固定字符串时,它起作用了!!!所以,即:

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

在下一个 Bean 中读取正确!!!所有的 bean 都使用 RichFaces @KeepAlive 注释来请求范围(我试过没有注释,它是一样的)。我已经尝试过: -将 a4j:commandButton 更改为 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> 

有谁知道为什么这不起作用?我过去曾使用过类似的托管属性参数并且它有效(意味着使用一些动态更改的值而不是静态字符串)。

4

1 回答 1

1

在初始请求期间(要显示表单时)而<f:param>不是在表单提交请求期间评估。所以它仍然是初始值,而不是更改后的值。

给出<a4j:commandButton>anid并在其中引用它,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>
于 2012-01-20T11:30:30.327 回答