【发布时间】:2013-10-10 11:32:45
【问题描述】:
我有一个需要定期生成大型报告的 MVC3 应用程序。用户可以选择他们的标准并启动报告。现在我正在使用 javascript window.open() 方法打开一个新选项卡/窗口。在生成报告时,用户无法使用该站点。一切都等到生成报告。 生成报告的代码是:
private FileStreamResult doSpecReport(List<int> idProjItems)
{
PdfDocument outputDocument = new PdfDocument(); // returning to the user
foreach(var id in idProjItems)
{
var item = _entities.ProjectEquipmentItems.First(f => f.idProjectEquipmentItem == id);
var cutsheetPath = item.CutSheet;
Dictionary<string, string> dictionary = new Dictionary<string, string>();
dictionary.Add("p_idEquipmentItem", id.ToString());
var fs = GetReportHtml("NameOfReport", dictionary); // Returns FileStreamResult from crystal
var inputDocument1 = CompatiblePdfReader.Open(fs.FileStream); // add report to output doc
int count = inputDocument1.PageCount;
for(int idx = 0; idx < count; idx++)
{
PdfPage page = inputDocument1.Pages[idx];
outputDocument.AddPage(page);
}
if (!string.IsNullOrEmpty(cutsheetPath))
{
cutsheetPath = Path.Combine(Server.MapPath("~/Files/CutSheetFiles/"), cutsheetPath);
if (File.Exists(cutsheetPath))
{
var inputDocument2 = CompatiblePdfReader.Open(cutsheetPath);//, PdfDocumentOpenMode.Import);
count = inputDocument2.PageCount;
for(int idx = 0; idx < count; idx++)
{
PdfPage page = inputDocument2.Pages[idx];
outputDocument.AddPage(page);
}
}
}
}
var ms = new MemoryStream();
outputDocument.Save(ms, false);
ms.Position = 0;
return new FileStreamResult(ms, "application/pdf")
{
FileDownloadName = "Report.pdf"
};
}
我不确定我是否做错了什么,我不明白为什么这个过程会占用浏览器的所有资源。感谢您的帮助。
更新:调用 doSpecReport 的代码版本。围绕成功的代码不起作用。
$.ajax({
url: url,
data: qdata,
type: "POST",
success: function (result) { // this doesn't actually work.
var obj = $('<object type="application/pdf" width="100%" height="100%" border="2"></object>');
obj.attr('data', 'data:application/pdf;base64,' + result);
$(".mask").hide();
$('#divContainer').append(obj);
}
});
【问题讨论】:
-
这看起来像 C# 代码,而不是 JavaScript;最终用户系统上的浏览器除了等待服务器返回之外什么都不做……如果您希望浏览器在服务器处理时保持响应,则需要使用某种异步调用。 ..
-
你是对的,javascript标签是由于我打开调用此代码的窗口的方式。我在想可能有一些方法可以修改该代码,以确保该代码在不同的线程中运行。并且通过 ajax 发送请求仍然持有网站的人质。
-
您能否发布您尝试用于异步调用的实际 JavaScript 代码?
-
编辑了我的问题以添加代码。
标签: c# javascript ajax asp.net-mvc-3 pdf