无法在f:viewParam中重定向页面获取f:param

时间:2014-02-04 12:10:30

标签: jsf jsf-2 primefaces

我在generalPage.xhtml中有下面的命令按钮,它有GeneralPageMB支持bean。

    <p:commandButton value="#{facility.facilityName}" ajax="false"
                        action="facilityHome.xhtml?faces-redirect=true&amp;includeViewParams=true">
                        <f:param name="fid" value="#{facility.id}" />
    </p:commandButton>

我有第二页facilityHome.xhtml,其中包含以下代码:

     <div style="width: 400px; height: 250px;" class="loginContainerBg">
                <h:form id="f" prependId="false">
                    <f:metadata>
                        <f:viewParam name="fid" value="#{facilityHomeMB.facilityId}"
                            converter="com.ot.common.utility.FacilityIdConverter" />
                    </f:metadata>
     </div>

facilityHome.xhtml将支持bean作为FacilityHomeMB。所以我试图获取View参数并在FacilityHomeMB bean中设置为facilityId属性。我的问题是facilityId没有设置。代码有什么问题?任何帮助将不胜感激。

我正在使用tomcat 7,Primefaces 4.0,Mojarra 2.1。

1 个答案:

答案 0 :(得分:1)

<p:commandButton>是错误的工具。它的目的是执行POST请求,从而提交封闭表单的数据。它不是用于页面到页面的导航。您的具体问题是由于您之后显式发送重定向导致的,导致带参数的初始请求丢失。

最好只使用<p:button>。这样你也不再需要整个<h:form>而且你也不需要混淆faces-redirect等。

<p:button value="#{facility.facilityName}" outcome="facilityHome">
    <f:param name="fid" value="#{facility.id}" />
</p:button>

就是这样。

在目标页面中,只需保留<f:metadata>,但不应将其嵌套在表单中。另请参阅When using <ui:composition> templating, where should I declare the <f:metadata>?此外,您绝对不应使用prependId="false"。这与当前的问题无关,但它会使JSF ajax完全混乱(无法找到要渲染的组件等)。

另见: