【问题标题】:commandLink is not fired in a page with a param in its URI在其 URI 中带有参数的页面中不会触发 commandLink
【发布时间】:2012-10-09 13:07:40
【问题描述】:

当我在其 URI 中使用参数调用页面中的方法时,除非我再次传递 uri 的参数,否则不会调用该方法。例如,如果我有:

http://maywebsite/myapp/mypage.xhtml?mykey=myvalue

此方法会导致错误(显然是因为它在没有参数的情况下再次呈现页面,但从未调用方法 foo):

<h:commandLink value="Do Action" actionListener="#{mybean.foo}"/>

所以我添加了一个 ajax 来只更新组件,但按钮没有被触发:

<h:commandLink value="Do Action" actionListener="#{mybean.foo}">
    <f:ajax render="somecomponent"/>
</h:commandLink>

当我再次传递参数值时,按钮调用该方法就好了:

 <h:commandLink value="Do Action" actionListener="#{mybean.foo}">
     <f:param name="mykey" value="myvalue"/>
     <f:ajax render="somecomponent"/>
 </h:commandLink>

但是,这个按钮包含在许多具有不同参数键和值的页面中 (ui:include)。如何在不传递参数值的情况下调用该方法?

我正在使用 glassfish 3.1.2、jsf 2.0

【问题讨论】:

    标签: jsf


    【解决方案1】:

    显然 bean 是请求范围的,并且参数在命令链接的呈现方式中发挥作用(例如,通过其父组件之一上的 rendered 属性,或通过包含命令的模板的动态包含关联)。

    所有这些条件都在表单提交的应用请求值阶段重新评估。开发人员必须确保所有这些条件与将表单呈现给最终用户时完全相同。因此,当 bean 为请求范围且参数不存在时,命令链接在组件树中显示为未呈现,这样就不会调用其操作。

    将 bean 放入视图范围是解决此问题的最简单方法(除非您使用动态 &lt;ui:include&gt;,否则会更复杂,您需要关闭特定视图的部分状态保存) .

    另见:

    【讨论】:

    • 我没有请求 bean,而且我正在使用动态 ui:include。我不得不更改逻辑并制定解决方法来解决此问题。感谢您的解释。
    猜你喜欢
    • 1970-01-01
    • 2014-10-31
    • 2011-01-07
    • 2012-04-16
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    相关资源
    最近更新 更多