ASP.NET MVC返回文件结果,其他数据在客户端进行处理

时间:2014-04-02 11:17:07

标签: c# javascript jquery asp.net-mvc

我目前正在收集如何解决以下问题的建议:我实时生成报告并使用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或其他技术来解决这个问题?

2 个答案:

答案 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的记录,你必须在某个时候清理它。