【发布时间】:2016-04-04 06:28:07
【问题描述】:
我有一个 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 下载 action:
[HttpPost]
public FileResult Download(ItemsArrayWrapper array)
{
// here goes incoming data processing logic
// ...
return File(array.ConvertToItemsArray().Serialize(), "text/xml", name);
}
我希望我的下载方法返回 FileResult,因此客户端上会出现一个文件保存对话框。但什么都没有发生。
我尝试过构造各种响应头,返回不同的MimeType,改变Download方法的返回类型,甚至尝试从Download方法中调用[HttpGet]方法,但客户端仍然没有出现。
在浏览器网络监控中搜索 - 只发送了一个 POST 请求。
是否可以将数据从 HttpPost 方法发送到客户端,以这种方式从 angularJs 函数调用?我缺少什么,为什么浏览器中没有显示保存对话框?
或者任何人都可以提出任何其他更合适的解决方案来实现这一目标?
【问题讨论】:
-
Post Request 的 HttpResponse 状态码是 200 还是 500?仅用于测试,您可以尝试使用带有一些虚拟数据的 ActionLink(带有 HttpGet)来查看文件下载是否有效?
-
您将需要处理 ajax 响应,如 this question。可以找到使用 typescript 和名为 FiledSaver 的库的类似方法in this other question
-
@user1672994: HttpResponse 是 200,我不能通过 Get 发送这个表单数据,因为我必须发送图像数据。我以前通过asp.net mvc+jQuery实现了工作,现在卡住了,试图通过angularJs来实现。
标签: javascript c# angularjs asp.net-mvc http-post