![](/img/trans.png)
[英]How to encapsulate a reusable “control” for ASP.NET MVC 3 + Razor views
[英]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 报告的所有逻辑,但我不确定如何将其返回到视图中。 感谢您对此的任何帮助。
流程:
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)调用的部分操作。 然后这个部分操作将根据您的输入准备一个文件并将字节/状态发送到视图。
根据状态,您可以决定是否允许下载文件或显示状态消息。
这是一个推荐的流程:
执行上述操作不需要任何清理工作或在内存中保存大量文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.