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



My Controller/Action从视图中接收一些Id(通过Post(。

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

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

流程:

  1. 接受视图中的ID列表(完成(
  2. 获取这些ID的结果(已完成(
  3. 生成未提取数据的ID列表(已完成(、提取Excel格式数据的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);

在剃刀视图中,您可以编写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,直到所有文件都在上得到处理。允许用户在文件可用时立即下载

执行上述操作将不需要任何清理作业,也不需要在内存中保存大量文件。

最新更新