我有文件名的超链接,想要下载从数据库中检索到的文件。我可以下载该文件,但在此过程中会发布表单。而不是这个,我希望表单不是在ajax的帮助下发布的,但我的代码在Ajax调用中遇到错误。有没有明智的方法来实现这一目标?
查看:
<a onclick="downloadFile(@Model.ID);" target="blank">@Model.FileName</a>
<script>
function downloadFile(id) {
$.ajax({
url: '@Url.Action("Download", "Controller")',
type: "POST",
data: JSON.stringify({ 'id': id }),
dataType: "json",
traditional: true,
contentType: "application/json; charset=utf-8",
success: function (data) {
if (data.status == "Success") {
alert("Done");
} else {
alert("error occurs on the database level!");
}
},
error : function () {
alert("an error has occured!!!");
}
});
}
</script>
的控制器:
public FileContentResult Download(int id)
{
var dataContext = repository.Attachments.FirstOrDefault(p => p.ID == id);
if (dataContext != null)
{
return File(dataContext.FileData, dataContext.FileMimeType);
}
else
{
return null;
}
}
答案 0 :(得分:1)
为什么不将链接更改为
<a href="@Url.Action("Download", "Controller", new { id = Model.ID })" >@Model.FileName</a>
答案 1 :(得分:1)
下载文件的最简单方法是直接链接它,如调用操作:&#34; / FileController / Download?Id = 2&#34;
问题是,如果您收到错误,它会将您重定向到空白页面...
为了解决这个问题,我创建了这个函数:
function DownloadFile(id, Type) {
var hiddenIFrameID = 'hiddenDownloader',
iframe = document.getElementById(hiddenIFrameID);
if (iframe === null) {
iframe = document.createElement('iframe');
iframe.id = hiddenIFrameID;
iframe.style.display = 'none';
document.body.appendChild(iframe);
}
if (Type == undefined || Type == "")
Type = null;
iframe.src = "/File/Download?ID=" + id;
}
此函数创建一个指向文件路径(操作)的隐藏iframe。如果它出错,它不会炸毁你的页面。