繁体   English   中英

的行动 <p:commandButton> 内 <ui:fragment rendered> 没有被调用

[英]Action of <p:commandButton> inside <ui:fragment rendered> is not invoked

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

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

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

我怎样才能正确行为?

在处理表单提交期间,输入/命令组件及其所有父项的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这样的搜索机器人可以更好地找到和索引他们)。

也可以看看:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM