返回从HttpPost Asp.Net MVC方法保存的文件

本文关键字:方法 保存 文件 MVC Net HttpPost Asp 返回 | 更新日期: 2023-09-27 18:28:25

我有一个Asp.Net MVC项目,在其中的一页上,用户可以将加载的数据编辑到表中(更改图像、字符串、项目顺序等)。

完成所有编辑后,客户端按下下载按钮,并将生成的xml文件保存在硬盘上,以便将来进行下一次操作。

所以我有一个简单的html表单:

 <form name="mainForm" data-ng-submit="sendForm()" ng-controller="ImportController" novalidate enctype="multipart/form-data">
    <!-- table structure definition removed for briefing -->
    <td>
        {{data.Items[$index].Id}}
    </td>
    <td>
        <img class="center-cropped" ng-src="data:image/jpg;base64, {{data.Items[$index].Image}}">
    </td>
    <td>
        <input class="form-control" type="text" value="{{data.Items[$index].LastName}}" />
    </td>
    <td>
        <input class="form-control" type="text" value="{{data.Items[$index].FirstName}}" />
    </td>
    <td>
        <input class="form-control" type="text" value="{{data.ClaimItems[$index].MiddleName}}" />
    </td>
    <input class="btn-success" id="submit-btn" type="submit" data-ng-disabled="mainForm.$invalid" value="Download" />
</form>

该表单数据通过angularJs函数调用发送,看起来像:

$scope.sendForm = function () {
    // some preparations to send image data through json
    for (var i = 0; i < $scope.data.Items.length; i++) {
        $scope.data.Items[i].ImageAsString = $scope.data.Items[i].Image;
    }
    $http.post("Download", { array: $scope.data })
        .success(function (responseData) {
            console.log(responseData);
        })
        .error(function (responseData) {
            console.log("Error !" + responseData);
        });
};

调用此函数后,准备好的http post请求被发送到asp.net mvc下载操作:

    [HttpPost]
    public FileResult Download(ItemsArrayWrapper array)
    {
       // here goes incoming data processing logic
       // ...
       return File(array.ConvertToItemsArray().Serialize(), "text/xml", name);
    }

我希望我的Download方法返回FileResult,以便在客户端上显示一个文件保存对话框。但什么都没有发生。

我尝试过构建各种响应头,返回不同的MimeTypes,更改Download方法的返回类型,甚至尝试过从Download方法调用[HttpGet]方法,但客户端上仍然没有出现任何内容。

在浏览器网络监控中搜索-只发送一个POST请求。

是否可以将数据从HttpPost方法发送到客户端,该客户端是以这种方式从angularJs函数调用的?我缺少什么,为什么浏览器中没有显示保存对话框?

或者有人能提出其他更合适的解决方案来实现这一点吗?

返回从HttpPost Asp.Net MVC方法保存的文件

我希望我的Download方法返回FileResult,这样对话框将出现在客户端上。但什么都没有发生。

什么都没发生是正常的。我建议你不要使用AJAX来下载文件。只需构造一个普通的隐藏HTML表单,然后将此表单自动提交给Download控制器操作。然后将出现"文件保存"对话框,提示用户保存文件。

如果你绝对需要使用AJAX来完成这项工作,那么应该注意的是,你可以使用HTML5 FileAPI,它允许你在AJAX回调中保存二进制响应。但请注意,这只适用于现代浏览器,如果你需要在网站中支持一些旧浏览器,你无论如何都需要第一种方法。