【问题标题】:submit multiple forms with p:commandbutton使用 p:commandbutton 提交多个表单
【发布时间】:2012-04-02 02:10:50
【问题描述】:

我想用一个提交按钮提交多个表单。我有多个表单,因为每个 p:fileUpload 都需要一个自己的表单(在高级模式下)。

这是我的提交按钮的代码:

<h:form id="form1">...</h:form>
<h:form id="form2">...</h:form>
<h:form>
    <p:commandButton value="Save" widgetVar="saveButtonBottom"
    action="#{bean.submit}" ajax="false"
    process=":form1,:form2,@this" />
</h:form>

它确实调用了 bean.submit(),但它不处理其他表单。也许我对处理的理解是错误的,但我想如果我把一个表单放入“处理”,那么它就会被提交。

知道如何让它工作吗?

【问题讨论】:

    标签: jsf jsf-2 primefaces


    【解决方案1】:

    这就是 HTML 的局限性。只有包含在当前表单(其中调用了命令)中的输入数据将被发送到服务器端。至于process 属性,它只标识提交的数据到达后必须由JSF处理的部分。

    知道如何让它工作吗?

    将所有相关数据放在同一个表格中。如有必要,只需使用单个 &lt;p:fileUpload&gt; 并支持多个文件选择。

    【讨论】:

    • 我有一个文件上传字段支持单个文件,一个支持多个文件选择。它们用于不同的目的,所以我无法合并它们。
    • 这是纯 HTML 的限制,但不是 JavaScript 的限制。为什么它会影响 JSF 2?是否会有完整的 AJAX JSF 3 来跟上现代世界的步伐?
    • 这仍然有效吗?我有一种印象,使用 ajax 样式处理它可以读取整个 DOM 树,并发送页面的任何部分,甚至在当前表单之外。
    • 在 PrimeFaces 中添加 partialSubmit="true" 会使其行为不同。然后在某些情况下可以提交多个表单(至少是数据)。不要认为这是设计使然,但更可能的副作用是不应依赖
    • @Kukeltje:这确实是未指明的行为。
    【解决方案2】:

    把这个放在form2里面:

    <p:remoteCommand name="sendAjaxicalPGfilter"
    update="form2:minMaxTable"
    action="#{OptimizationSettingsBean.handleProductGroupChange}"  />
    

    在 form1 命令按钮上调用它

    <p:commandButton value="Done"
    oncomplete="selectedSettingDlg.hide();" onstart="sendAjaxicalPGfilter();"
    ajax="true" action="#{CreateSourcingPlanBean.dummy}" 
                                update=":form1:assignmentList" >
                    </p:commandButton>
    

    【讨论】:

    • 谢谢,我现在才看到你的回答。我将在下周尝试你和 rootkit 的答案,并告诉你什么是有效的(该项目去年夏天很活跃,所以我必须先找时间重新开始)。据我了解,这两个答案都非常相似,只是您建议使用 remoteCommand 而不是触发按钮提交。
    【解决方案3】:

    正如 BalusC 正确指出的那样,您只能在一个请求中提交一个表单。但是,您可以一键调用多个请求:

    <p:commandButton value="Save" widgetVar="saveButtonBottom"
        action="#{bean.submit}" ajax="false" onstart="form1submitbutton.getJQ().click();form2submitbutton.getJQ().click()"
        process="@form" />
    

    您必须意识到这将导致您的服务器同时处理多个请求,并且无法保证请求处理顺序。这会使验证和后端数据处理变得棘手。您可以尝试通过使用 oncomplete 处理程序并以这种方式依次触发表单提交来解决此问题,但这仍然意味着您的表单数据将被一个接一个地发送到服务器。

    此外,上述方法仅在您的表单通过 ajax 提交时才有效。

    【讨论】:

    • 视情况而定。如果您使用上面的示例代码,它将是同时的。如果您使用 oncomplete 处理程序,那么您可以按顺序执行。
    【解决方案4】:

    在你的

    <p:commandButton value="Save" widgetVar="saveButtonBottom"
        action="#{bean.submit}" ajax="false"
        process=":form1,:form2,@this" />
    

    将属性:partialSubmit="true" 和机会ajax="false" 添加到ajax="true"

    <p:commandButton partialSubmit="true" value="Save" widgetVar="saveButtonBottom"
        action="#{bean.submit}" ajax="true"
        process=":form1,:form2,@this" />
    

    【讨论】:

    • 在我的情况下确实如此,我没有在这里尝试过这个例子。让我看到你。请看我的下一个答案。我对stackoverflow不是很熟悉,抱歉。
    • 我想把我所有的代码放在这里,但我真的不知道怎么做。不过,我想解释一下我是如何做到的。我有一个包含一些按钮的表单。我有另一个包含可编辑字段的表单。没有 partialSubmit = true 这不起作用。我也在论坛里找到了。因此,如果您想投反对票,请继续,我只是说它确实对我有用。
    • 如果有效,则无需投票(但请删除您的其他“答案”)。如果您确定添加 partialSubmit="true" 会有所作为,也无需发布完整代码。减少一个表单中提交的字段数量的东西也可以用于提交多个表单的字段,这是非常不合逻辑的。 The source 可能会证明为什么会这样......稍后会调查,或者您可以这样做并将其添加到您的答案中。
    • 我进行了调查,并且确实(未实际测试/调试)对于进行部分提交,PrimeFaces 解析了在@下指定的每个 id 下的 所有 组件987654328@ 属性。因此,添加多个表单会添加所有表单中的所有输入,如上所述。但是...您可能 not 将 'ajax' 设置为 false,而您在其他答案中没有这样做。所以事实上这个答案是不好,但可以通过添加一些关于ajax的信息来改善它......
    • 感谢您的改进。我会继续调查和测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    相关资源
    最近更新 更多