Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.net WebAPI通过ajax调用返回文件_C#_Ajax_Asp.net Mvc_Asp.net Web Api - Fatal编程技术网

C# ASP.net WebAPI通过ajax调用返回文件

C# ASP.net WebAPI通过ajax调用返回文件,c#,ajax,asp.net-mvc,asp.net-web-api,C#,Ajax,Asp.net Mvc,Asp.net Web Api,我目前正在寻找一种方法来强制下载通过WebAPI控制器返回的文件 我用它作为参考 在我的客户机上,我使用ajaxget调用发送对象的ID并尝试下载文件 exportList: (foo, callback) => path = '/api/export/id' path = path.replace("id", foo.id) $.ajax( url: path, dataType: '

我目前正在寻找一种方法来强制下载通过WebAPI控制器返回的文件

我用它作为参考

在我的客户机上,我使用ajaxget调用发送对象的ID并尝试下载文件

    exportList: (foo, callback) =>
        path = '/api/export/id'
        path = path.replace("id", foo.id)
        $.ajax(
            url: path,
            dataType: 'text',
            success: (data) =>
                callback(data)
            error: (data) =>
                callback(false)
        )
在服务器端,我将上面的URI路由到下面的方法

    [AcceptVerbs("GET")]
    public HttpResponseMessage ExportList(int id)
    {
        string file = fooService.ExportList(id);

        if (file == null)
        {
            return Request.CreateResponse(HttpStatusCode.NoContent);
        }
        HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
        result.Content = new StringContent(file);
        result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
        result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
        result.Content.Headers.ContentDisposition.FileName = "List.csv";

        return result;
    }
fooService.ExportList方法只创建一个csv字符串

当看到请求返回到客户端时,响应中确实包含csv字符串,但不会提示或强制客户端下载该字符串


这是正确的方法吗?

不要使用ajax请求下载。执行完整的GET请求。如果需要,请在新窗口中打开下载

<a href="..." target="_blank">download file</a>

我认为您之所以使用javascript是因为动态id?如果您可以直接使用表单发布,那么请使用这种解决方案。如果确实需要javascript,那么使用这段代码来模拟表单操作:

$.download = function (url, data, method) {
    if (url && data) {
        //data can be string of parameters or array/object
        data = typeof data == 'string' ? data : jQuery.param(data).replace("\+", " ");
        data = data.replace(/\+/g, " ");
        var inputs = '';
        jQuery.each(data.split('&'), function () {
            var pair = this.split('=');
            inputs += '<input type="hidden" name="' + pair[0] + '" value="' + pair[1] + '" />';
        });
        //send request
        jQuery('<form action="' + url + '" method="' + (method || 'post') + '">' + inputs + '</form>')
        .appendTo('body').submit().remove();
    };
};

我使用的是动态ID,因此我不能真正硬编码href。@如果您可以动态进行AJAX调用,那么是什么阻止您动态设置href?@Dismissible我可以更新href,但这将比其他解决方案“开销”产生更多的开销。我对此表示怀疑。无论您发现什么是最容易维护和最不可能引入副作用的,都将是一个好的解决方案。这看起来是一个不错的解决方案,但当按描述使用时,数据和方法参数都将为空,因此它不会通过If语句。您是否可以稍微扩展一下$.download方法?我可以通过调用$.download(path,“,”get“)使其正常工作。您应该使用数据调用下载。如果没有可用的数据,那么可以将{}作为参数传递。我希望这将帮助你(如果不只是问)!
path = '/api/export/id'
path = path.replace("id", foo.id)
$.download(path);