我目前正在收集如何解决以下问题的建议:我实时生成报告并使用File
方法将其返回到浏览器。
public ActionResult GenerateReport()
{
var report = ... // Don't care, we get an object containing an Id and a byte array
var reportId = report.Id; // this is actually important
return File(report.Data, "..."); // Return data with some content type, filename etc.
}
执行操作时,浏览器将提示文件下载。但我也想以某种方式将新Id
转移到我需要处理的浏览器。
您是否知道如何使用常见的JavaScript(jQuery)和Web / ASP.NET / Ajax或其他技术来解决这个问题?
答案 0 :(得分:1)
使用cookies!
在您的响应中添加一个cookie,然后循环查找它的jquery代码。在该cookie中,您可以添加id并在找到后停止循环。然后再删除它。
例如,我使用下面的ActionFilter检测文件何时处理下载,使用File actionresult就像你一样。
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
var key = filterContext.HttpContext.Request.QueryString["downloading"].ToString();
if (key != null)
{
var cookie = new HttpCookie(key);
cookie.Path = "/";
filterContext.HttpContext.Response.Cookies.Add(cookie);
}
}
答案 1 :(得分:0)
我们终于得出结论,我们能够在后端进行更改,现在我们可以请求临时"没有实际启动报告生成的ID,而实际的报告生成现在需要提供ID。这就是客户端现在的样子:
function generateReport() {
$.ajax({
url: "/GetNewReportId", // A) This is where we get the new ID
method: 'POST'
})
.done(function (result) {
if (result) {
// The ID is returned here: result.Id
// Open the confirmation modal with Id assigned
showConfirmationModal(result.Id);
// B) This will lead to a download-prompt and leave site functioning
window.location = "/GenerateReport?id=" + resultId;
}
});
}
操作/GetNewReportId
是一个简单的Mvc操作,返回JsonResult
,仅包含ID。此外,代码被简化为向您呈现的想法,它尚未经过最终形式的测试。
但是有一些缺点:如果进程在步骤A)和B)之间的某处失败,你可能最终得到一些未处理的Id的记录,你必须在某个时候清理它。