使用p:commandbutton提交多个表单

8
我希望您能用一个提交按钮提交多个表单。由于每个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(),但它没有处理其他表单。也许我的处理理解有误,但我认为如果我将一个表单放入"process"中,那么它就会被提交。

有什么办法可以让它工作?

4个回答

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

有什么办法可以让它工作吗?

将所有相关数据放在同一个表单中。如有必要,使用仅支持多文件选择的单个<p:fileUpload>

我有一个文件上传字段支持单个文件选择,还有一个支持多个文件选择。它们用于不同的目的,所以我不能将它们合并。 - Thomas Walther
1
这是纯HTML的限制,但不是JavaScript的限制。它为什么会影响JSF 2?是否会推出完全基于AJAX的JSF 3以跟上现代世界的步伐? - Danubian Sailor
这仍然有效吗?我有一种印象,使用 Ajax 样式处理时它可以读取整个 DOM 树,并发送页面的任何部分,甚至超出当前表单。 - YoYo
在PrimeFaces中添加partialSubmit="true"会使其表现不同。然后在多个表单可以提交(至少数据可以)的情况下。不要认为这是设计上的,而更可能是不应该依赖的副作用。 - Kukeltje
@Kukeltje:确实是未指定的行为。 - BalusC

5

将此放入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而不是触发按钮提交。 - Thomas Walther

4

in your

<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不是很熟悉,抱歉。 - theo231022
我想把我的所有代码放在这里,但我真的不知道该怎么做。不过我想稍微解释一下我是如何做到的。我有一个包含一些按钮的表单。我还有另一个包含可编辑字段的表单。如果没有partialSubmit = true,这将无法正常工作。我在论坛上也找到了相关信息。所以如果你想要负面评价,那就去吧,我只是说这对我有效。 - theo231022
如果它能正常工作,就没有必要进行负面评价(但请删除您的其他“答案”)。如果您确定添加了 partialSubmit="true" 会产生差异,则也无需发布完整代码。减少在一个表单中提交字段的数量的东西,也可以用于提交来自多个表单的字段,这只是非常不合逻辑的。源代码可能证明为什么这样做是有效的...稍后将进行调查,或者您可以进行调查并将其添加到您的答案中。 - Kukeltje
我进行了调查,确实看起来(没有实际测试/调试)对于执行部分提交,PrimeFaces会解析process属性下指定的每个ID下的所有组件。因此,添加多个表单将添加上述所有表单中的所有输入。但是...您可能不应该将'ajax'设置为false,这是您在其他答案中没有做的。因此,实际上这个答案是不好的,但可以通过添加一些关于ajax的信息来改善它... - Kukeltje
感谢您的改进。我将继续进行调查和测试。 - theo231022

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处理程序,则可以按顺序执行。 - rootkit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接