gpt4 book ai didi

ajax - 有条件地提供文件下载或显示导出验证错误消息

转载 作者:行者123 更新时间:2023-12-04 11:22:37 27 4
gpt4 key购买 nike

我一直在研究 CRUD 应用程序,我需要将数据从数据库导出到 csv 文件。
为了导出,我必须以以下代码所示的方式禁用 ajax:

<p:commandButton value="Export" ajax="false" action="myController.export"/>

在调用的方法中,我创建文件并通过 OmniFaces 实用程序方法下载它:
Faces.sendFile(file, true);

使用相同的方法,我检查是否确实有任何数据,如果没有任何数据,则会显示警告对话框:
RequestContext.getCurrentInstance().showMessageInDialog(new FacesMessage(FacesMessage.SEVERITY_WARN, "Warning!", "No available data for export."));

现在,虽然所有这些都按预期工作,但问题是由于禁用了 ajax,无法动态显示对话框,并且重新加载页面。如果启用 ajax,则动态显示对话框,但不会开始文件下载。

我一直试图通过使用 Monitor download 来解决这个问题。 ,或者通过强制单击第二个按钮,但到目前为止我还没有在这件事上取得任何进展。

是否有任何普遍可接受的方法来解决这样的问题?

最佳答案

Is there any generally acceptable way of solving issues like this one?



您基本上希望首先触发一个 ajax 请求并在其 oncomplete 检查它是否成功,然后触发一个同步请求以下载文件(注意您 can't 使用 ajax 下载文件)。您可以使用 FacesContext#validationFailed() (或 OmniFaces Faces.validationFailed() )标记验证失败状态,可通过 args 获得PrimeFaces 在 oncomplete 中注入(inject)的对象函数上下文(注意 ajax 相关属性,如 oncomplete 在禁用 ajax 时不起作用)。

像这样的东西:
<p:commandButton 
value="Export"
action="#{bean.export}"
oncomplete="if (args &amp;&amp; !args.validationFailed) PF('download').jq.click()" />
<p:commandButton
widgetVar="download"
styleClass="ui-helper-hidden"
action="#{bean.download}" ajax="false" />
public void export() {
// Prepare file locally.

if (fail) {
// Show message your way and then set validation failed as below.
Faces.validationFailed();
}
}

public void download() throws IOException {
Faces.sendFile(file, true);

// Delete local file afterwards?
}

注意隐藏的 <p:commandButton>正在使用而不是 <p:remoteCommand>因为后者不支持 ajax="false" .

关于ajax - 有条件地提供文件下载或显示导出验证错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32591795/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com