不调用<ui:fragment rendered =“”>中<p:commandbutton>的操作</ui:fragment> </p:commandbutton>

时间:2013-06-25 12:23:27

标签: jsf primefaces

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

<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>

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

我怎样才能正确行事?

1 个答案:

答案 0 :(得分: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等搜索机器人可以更好地查找和索引它们)。

另见: