我有一个提供文件的动作:
public override FileContentResult Foo() {
var someDataAsBytes = ...
return File(someDataAsBytes, "text/csv", "somefilename.csv");
}
表单很简单:
<form method="get" action="/Foo" id="myForm">
<button type="submit">Download</button>
</form>
我通过脚本启动下载(因此页面不会更改):
$("#myForm").on("submit", function() {
window.location.href = $(this).attr("action");
return false;
});
问题是两个请求被发送到服务器:一个GET和一个HEAD。该操作运行两次,但只提供一次文件。
如何让它只发送一个请求?或者这是正常行为吗?
额外信息:
我在Fiddler中检查了这一点,并且对GET和POST的响应是相同的,除了GET具有非零Content-Length
和实际有效载荷数据。对HEAD的回应一无所获。两者都返回200 OK状态代码。这是正常的吗?
答案 0 :(得分:3)
我认为您的代码没有任何问题。我复制了您的代码并试图重现您所面临的问题。但我无法在Chrome,IE和Firefox中重现。
看起来这个问题特定于你的FireFox浏览器,并且由于一些插件/扩展。禁用浏览器中的所有插件并试一试,它应该可以正常工作。
答案 1 :(得分:0)
您的脚本中缺少e.preventDefault()
。这里发生的事情是你的动作被脚本和普通帖子击中。因此,如果您将e.preventDefault()
置于下方,则会阻止浏览器的默认回发,只有javascript的代码才会执行您的请求。
$("#myForm").on("submit", function(e) {
e.preventDefault();
window.location.href = $(this).attr("action");
});