h:commandLink f:当页面有f时没有调用ajax动作:viewParam required =“true”

时间:2013-04-06 22:08:28

标签: ajax jsf jsf-2 commandlink viewparams

在我的网络应用程序中,JSF2(mojarra 2.1.20), 在包含以下代码段的组件的页面上存在奇怪的行为:

<h:commandLink ... action="#{cc.attrs.bean.next}">
    <f:ajax execute="@this" render=":#{cc.clientId}" />
</h:commandLink>

并不总是调用next()动作。我发现问题因某种原因与url参数id:

有关
<f:metadata>
    <f:viewParam name="id" value="#{torneoBean.idParam}" required="true" />
</f:metadata>

当我在上面插入viewParam时出现问题。但我无法摆脱它。调试ajax请求似乎启动,成功,完成事件序列被调用(无错误),正确呈现要呈现的组件但不触发操作。 有没有办法调试这种情况,找出问题的根本原因是什么?

1 个答案:

答案 0 :(得分:3)

显然,您没有将<h:message(s)>附加到<f:viewParam id="torneo_id">和/或您没有在每个ajax请求中更新它。否则,您将看到必需的验证错误。具体问题基本上由commandButton/commandLink/ajax action/listener method not invoked or input value not updated的第3点涵盖。

至于原因,<f:viewParam>在每个HTTP请求上执行,也在ajax回发上执行。当发送ajax请求时,当前请求中不再存在所需的请求参数,因此<f:viewParam>未通过所需的验证。

有几种解决方案:

  1. 在命令组件中保留<f:param>后续请求的请求参数。

    <h:commandLink ...>
        ...
        <f:param name="id" value="#{param.id}" />
    </h:commandLink>
    
  2. 仅在非回发期间使其成为必需。仅当页面最初由GET请求打开时,此方法才有效。但是,如果它通过非重定向导航打开,那么它仍然会失败。

    <f:viewParam ... required="#{not facesContext.postback}" />
    
  3. <f:viewParam>替换为JSF实用程序库OmniFaces <o:viewParam>提供的required="true"。它会在回发时隐式关闭<o:viewParam ... required="true" /> ,以便您继续使用相同的属性。

    {{1}}