14

我是使用带有 Web Api 的 ASP.NET MVC 4 的新手。

我想允许用户下载一个文件,这个文件我将在服务器端创建。为了创建文件,我设法掌握了以下代码

[ActionName("Export")]
public HttpResponseMessage PostExportData(SomeModel model)
{           
    string csv = _service.GetData(model);
    HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
    result.Content = new StringContent(csv);
    //a text file is actually an octet-stream (pdf, etc)
    result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
    //we used attachment to force download
    result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
    result.Content.Headers.ContentDisposition.FileName = "file.csv";
    return result;            
}

如何使用 JQUERY 调用此 Web API 方法?

但我不确定如何使用 jquery 调用这个 web api 并让它返回一个文件,其中包含下载任何文件时通常会得到的“另存为/打开”选项。

有人可以帮助我并指导我如何拨打电话和下载文件。谢谢。

4

1 回答 1

9

您可以在要使用 jquery 的视图中执行类似的操作。我假设控制器的名称是 ExportController。您还必须分解模型变量,或者HttpResponseMessage PostExportData(SomeModel model) 通过其他方式将模型收集到内部。

html:

<a class="export">export</a>

javascript:

<script>
$('a.export').click(function(e) {
    e.preventDefault();  //stop the browser from following
    window.location.href = '@Url.Action('Export', 'ExportController', new { property = model.property, property = model.property2 })';
});
</script>

使用POST

function UpdateForm(modelObject) {
   if ($('#hidden-form').length < 1)
   {
       $('<form>').attr({
           method: 'POST',
           id: 'hidden-form',
           action: '@Url.Action('Export', 'Export')'
       }).appendTo('body');
   }
   $('#hidden-form').html('');
   for(var propertyName in modelObject) {
       $('<input>').attr({
            type: 'hidden',
            id: propertyName,
            name: propertyName,
            value: modelObject[propertyName]
       }).appendTo('#hidden-form');
    }
}

$('a.export').click(function(e) {
    e.preventDefault();
    var modelObject = { property1 : "property1" };
    UpdateForm(modelObject);
    $('#hidden-form').submit();
});

然后你可以#hidden-form通过js发布,这将触发文件下载

更新:这是一个完整的发布示例,它没有检查错别字等,因此调试任何小错误。

于 2012-10-19T14:07:18.330 回答