繁体   English   中英

通过asp.net MVC中的ajax请求下载文件

[英]Download a file through ajax request in asp.net MVC

我正在尝试通过asp.net中的ajax调用下载文件

我的JavaScript:

var allData = dataSource.data();
    var query = new kendo.data.Query(allData);
    var data = query.filter(filters).data;
    var strAccountCodes = '';
    for (var i = 0; i < data.length; i++) {
        strAccountCodes += data[i].AccountCode + ",";
    }
$.ajax({
        url: '@Url.Action("GetHistoricalUsageApplicationFile", "HUProducts")',
        type: 'GET',
        data: { "accountCodes": strAccountCodes }
    });

我的动作方法:

public ActionResult GetHistoricalUsageApplicationFile([DataSourceRequest]DataSourceRequest request, [FromBody] string accountCodes)
    {
        var HistoricalUsagesData = _enrollmentManagementRepository.GetHistoricalUsageApplicationFile(accountCodes);
        List<HistoricalUsageApplicationFileModel> HUApplications = _mapper.MapToNew<List<HistoricalUsageApplicationFileModel>>(HistoricalUsagesData);
        //var HistoricalUsageApplication = HUReport.ToDataSourceResult(request).Data;

        var output = new MemoryStream();
        var writer = new StreamWriter(output, Encoding.UTF8);

        writer.Write("CommodityCode,");
        writer.Write("CustomerTypeCode,");
        writer.Write("EnrollmentRequestId");
        writer.WriteLine();

        var list = HUApplications.ConvertToString();
        var single = list.Aggregate((x, y) => { return string.Concat(x, y); });

        writer.WriteAsync(single);
        writer.Flush();
        output.Position = 0;

        return File(output, System.Net.Mime.MediaTypeNames.Application.Octet, "Products.csv");
    }

代码正在执行,没有任何错误,但是没有下载任何文件。

那是我所缺少的吗?

您应该知道AJAX调用并非旨在直接下载CSV文件。 因此,您可以从MemoryStream实例创建一个字节数组,并将其存储在SessionTempData变量中,然后返回“成功”状态以对AJAX成功响应启用重定向:

public ActionResult GetHistoricalUsageApplicationFile([DataSourceRequest]DataSourceRequest request, [FromBody] string accountCodes)
{
    var HistoricalUsagesData = _enrollmentManagementRepository.GetHistoricalUsageApplicationFile(accountCodes);
    List<HistoricalUsageApplicationFileModel> HUApplications = _mapper.MapToNew<List<HistoricalUsageApplicationFileModel>>(HistoricalUsagesData);
    //var HistoricalUsageApplication = HUReport.ToDataSourceResult(request).Data;

    var output = new MemoryStream();
    var writer = new StreamWriter(output, Encoding.UTF8);

    writer.Write("CommodityCode,");
    writer.Write("CustomerTypeCode,");
    writer.Write("EnrollmentRequestId");
    writer.WriteLine();

    var list = HUApplications.ConvertToString();
    var single = list.Aggregate((x, y) => { return string.Concat(x, y); });

    writer.WriteAsync(single);
    writer.Flush();
    output.Position = 0;

    // creates byte array from stream
    TempData["Output"] = output.ToArray();

    // returns successful state
    return Json("Success", JsonRequestBehavior.AllowGet);
}

其次,使用GET方法创建一个控制器动作,并将存储的字节数组从SessionTempDataFileResult

public ActionResult DownloadCSV()
{
    // retrieve byte array here
    var array = TempData["Output"] as byte[];
    if (array != null)
    {
        return File(array, System.Net.Mime.MediaTypeNames.Application.Octet, "Products.csv");
    }
    else
    {
        return new EmptyResult();
    }
} 

最后,处理success响应以包含location.href ,它将重定向到返回FileResult控制器以下载CSV文件:

$.ajax({
    url: '@Url.Action("GetHistoricalUsageApplicationFile", "HUProducts")',
    type: 'GET',
    data: { "accountCodes": strAccountCodes },
    success: function (result) {
        if (result == "Success") {
            location.href = '@Url.Action("DownloadCSV", "ControllerName")';
        }
    }
});

作为一种选择,您可以使用查询字符串从AJAX响应中将CSV文件名作为参数传递。

相关问题:

从流创建字节数组

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM