[英]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.