3

我想做这样的事情(根据某些情况重定向到不同的页面!):

<ui:fragment rendered="#{projectPageBean.availableMethods}">
    <p:commandButton id="test"
        value="View Instrument"
        action="instrumentLayout?faces-redirect=false"/>                                 
</ui:fragment>
<ui:fragment rendered="#{not projectPageBean.availableMethods}">
    <p:commandButton id="test1"
        value="View Instrument"
        action="methodLayout?faces-redirect=false"/>       
</ui:fragment>

但是这种结构似乎不起作用;动作属性中的页面重定向永远不会执行!

我怎样才能让这种行为正确?

4

1 回答 1

4

在处理表单提交期间,rendered输入/命令组件及其所有父组件的属性被重新评估,作为防止篡改请求的一部分。如果它评估false,那么任何子输入/命令组件都不会被解码,提交的值不会被设置,调用的动作也不会被排队。

显然这就是这里发生的事情。将 bean 放在视图范围内应该可以解决它。

@ManagedBean
@ViewScoped
public class ProjectPageBean {}

这样,只要您通过(ajax)回发与相同的视图交互,bean 就会存在。

也可以看看:


与具体问题无关,使用命令按钮进行简单的页面到页面导航是很奇怪的。最好使用常规按钮。

<ui:fragment rendered="#{projectPageBean.availableMethods}">
    <p:button id="test"
        value="View Instrument"
        outcome="instrumentLayout"/>
</ui:fragment>
<ui:fragment rendered="#{not projectPageBean.availableMethods}">
    <p:button id="test1"
        value="View Instrument"
        outcome="methodLayout"/>
</ui:fragment>

这也将解决具体问题。它只会在指定的 URL 上发送一个普通的 GET 请求,而不是执行回发,从而导致所有 JSF 表单处理运行,进而最终发送另一个 GET 请求作为重定向。这样就不会那么笨拙了。请注意,您可以通过<h:form>这种方式安全地将这些按钮放在外面。

如果您制作它们<h:link styleClass="ui-button ui-state-default ui-corner-all">而不是<p:button>,那么它对 SEO 更加友好(即,像 Googlebot 这样的搜索机器人可以更好地找到它们并将它们编入索引)。

也可以看看:

于 2013-06-25T12:54:23.230 回答