繁体   English   中英

如何使用 ASP.NET MVC 生成多个包含附加数据的文件并将其返回到 Razor 视图?

[英]How do I generate and return multiple files with additional data to Razor views using ASP.NET MVC?

我的控制器/操作从视图(通过 Post)接收一些 Id。

对于每个 Id,将获取一个文件。 我需要沿着未获取任何结果的 ID 列表返回一些生成的 Excel 或 PDF 文件。 用户可以下载任何生成的文件。

我拥有构建失败的 ID 列表以及 Excel 和 PDF 报告的所有逻辑,但我不确定如何将其返回到视图中。 感谢您对此的任何帮助。

流程:

  1. 从视图中接受 ID 列表(完成)
  2. 获取这些 ID 的结果(完成)
  3. 构建未获取数据的 ID 列表(完成)、获取 Excel 格式数据的 ID 报告(完成)和获取 PDF 格式数据的 ID 报告(完成)
  4. 返回第 3 步中构建的工件(需要帮助)

Post 可以是 Ajax 和非 ajax。 我猜你不是在做 Ajax 帖子。

将文件从控制器发送到视图更容易。 但是,您打算如何根据用户的选择交付文件? 视图由 Html、CSS 和 javascript 组成。 所以你必须想办法为你持有的二进制数据提供服务。

既然您将文件保存在内存中,那么为什么不将文件作为二进制数据发送到视图?

这是一个如何将文件发送到视图的代码示例:

楷模:

public class MyModel
{
    Public List<MyFile> files { get; post; }
    
    Public int TotalFilesProcessed { get; post; }
    Public int TotalFilesFailed { get; post; }
}

public class MyFile
{
    Public string FileName { get; post; }
    Public string FileExtension { get; post; }
    Public byte[] FileContent { get; post; }
    Public double FileLength { get; post; }
    Public double ContentType { get; post; } 
}

控制器/动作:

MyModel model = new MyModel();
MyModel.files = new List<MyFile>();

MyFile file1 = new MyFile();
file1.FileExtension = "pdf"
file1.FileContent = null; //Assign file byte from the memory
file1.FileLength = file1.FileContent.Length;
file1.ContentType = "application/octet-stream";
MyModel.files.Add(file1);

MyFile file2 = new MyFile();
file2.FileExtension = "png"
file2.FileContent = null; //Assign file byte from the memory
file2.FileLength = file2.FileContent.Length;
file2.ContentType = "application/octet-stream";
MyModel.files.Add(file2);

MyModel.TotalFilesProcessed = 5;
MyModel.TotalFilesFailed = 2;

return View(model);

在 razor 视图上,您​​可以编写 C# 代码来从模型中获取数据。 循环遍历List<MyFile>并将文件名呈现为 Html 按钮或超链接,以便用户可以单击并下载文件。

根据您的问题,您可以将文件发送到视图。 但实际的问题应该是当用户单击按钮时如何将字节传输给用户。

以下是一段代码,可帮助您将字节放入 javascript 代码中。 此处阅读代码的详细信息:

var bytes = new Uint8Array(resultByte); // pass your byte response to this constructor

var blob=new Blob([bytes], {type: "application/pdf"});// change resultByte to bytes

var link=document.createElement('a');
link.href=window.URL.createObjectURL(blob);
link.download="myFileName.pdf";
link.click();

这里的概念是从 html 页面传输字节,以便浏览器触发内容的文件下载。 您需要根据需要调整 js。

笔记:

我认为提前准备文件并保存在内存中不是一个好主意。

相反,为什么不准备一个可以从带有参数的页面(javascript)调用的部分操作。 然后这个部分操作将根据您的输入准备一个文件并将字节/状态发送到视图。

根据状态,您可以决定是否允许下载文件或显示状态消息。

这是一个推荐的流程:

  • 有一个部分操作,它需要一个 ID 并为此处理文件。 如果未找到数据,则发送 404 json 结果。
  • 对于所有 Id,在循环中调用部分操作并在您的 jabascript 中收集所有响应
  • 获得所有结果后(或者甚至在每个 ajax 响应进入时),您可以在 UI 中为此添加一个按钮/超链接。
  • 在 UI 上显示加载器,以便用户知道正在处理文件。 您可以选择阻止 UI,直到处理完所有文件,允许用户在文件可用时立即下载

执行上述操作不需要任何清理工作或在内存中保存大量文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM