【问题标题】:<a4j:commandLink> action not fired inside <form><a4j:commandLink> 动作未在 <form> 内触发
【发布时间】:2013-05-25 14:46:40
【问题描述】:

我正在做一个增强项目。有一个父 &lt;form&gt; 元素。我在这个父表单中包含了一个 XHTML 文件。包含的 XHTML 文件有一个&lt;a4j:commandLink&gt;。不会调用此操作。 现在,如果我将&lt;a4j:commandLink&gt; 包装在&lt;h:form&gt; 中,这将起作用。这样,父窗体的动作和&lt;a4j:commandLink&gt; 的动作一样被调用。但不鼓励嵌套形式。 我不能使用父表单的操作,因为它转到一个 servlet 并且我的操作在一个 请求范围 bean。我无法访问 servlet 中的 bean。 任何关于如何在没有&lt;h:form&gt; 的情况下进行操作调用的帮助都非常感谢。 下面是它的样子:

    <form id="parentFormId" name="parentFormId" action="aservletaction">
      <a4j:outputPanel id="includedRegion">

        <ui:include src="setupView.xhtml"></ui:include>
     </a4j:outputPanel>
   </form>

setupView.xhtml 的内容:

<ui:composition>
   <a4j:outputPanel>
        <h:form>
        <a4j:commandLink action="#{myBean.actionMethod}"
          render="adatatableid" limitRender="true"/>
        </h:form>
</ui:composition>

【问题讨论】:

    标签: jsf-2 xhtml richfaces ajax4jsf


    【解决方案1】:

    RichFaces 组件必须在表单中,否则它们将无法工作(至少是可执行组件)。

    现在,&lt;a4j:commandLink&gt;(和 commandButton)执行整个表单是默认行为,要更改它使用 execute attribute

    <a4j:commandLink execute="@this" … >
    

    这将限制执行仅限于链接。

    【讨论】:

    • 谢谢马基尔。那行得通。我不必在 commandLink 周围使用
      。这样它就调用了 bean 的动作。唯一的缺点是,它仍然提交父表单。
    • 父级不能是&lt;h:form&gt; 吗? commandLink 的重点在于它接管了表单的功能(即您为链接定义操作,而不是为表单定义操作)。提交该父表单的通常情况是什么?
    • 很遗憾,我不能将父表单保留为“
      ”。页面很大,有很多 servlet 调用,其他所有提交都需要通过表单的操作。我刚刚检查了萤火虫中的 POST 调用详细信息。整个表单内容是 POST 调用的一部分。但我可以看到 javax.faces.partial.ajax=true.
    • 好的,但是说“所有其他提交”是由某个组件执行的,那个组件不能直接调用bean吗?如果您使用除了 RichFaces 之外的任何其他东西,那么您可能比我更了解,但是这样的设计对我来说似乎很奇怪。 :) 除了必要的装饰之外,我从未使用过任何形式。
    • 没有。它不能。我使用 spring 的 getBean(...) 方法检查了 bean 实例。它返回空值。我需要 bean 的当前实例来调用 action 方法。
    【解决方案2】:

    它不应该工作。 不要嵌套表单,因为它在一般 HTML 中是不合法的,尤其是在 HTML 代码中由 JSF 呈现。因此,您的代码中有以下构造:

    <form>
        ...
        <h:form>
            ...
        </h:form>
        ...
    </form>
    

    摆脱它,它会按预期工作,即通过创建一个简单的表单到表单结构。

    【讨论】:

    • 我认为您还没有阅读说明。我知道嵌套表单是不合法的,但是这样它会调用 bean 中的操作方法。如果我删除了包装commandLink的表单,则永远不会调用该操作,因为父表单的操作被调用并且commandLink的操作以某种方式消失了。我正在寻找的是一种在没有嵌套表单的情况下仍然调用 commandLink 操作的方法。
    • 您需要正确地对数据进行聚类。正如我在回答中所说,两种并排形式是一个可行的选择。要理解的另一件事是两个表单发布到不同的网址
    • 让我以不同的方式指定我的问题:有没有一种方法可以让我从 a4j:commandLink 的 action 属性调用一个动作,而不依赖于父表单?
    猜你喜欢
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    相关资源
    最近更新 更多