我有
public class FileController : AsyncController
{
public ActionResult Download(FormCollection form)
{
FileContentResult file = new FileContentResult(Encoding.UTF8.GetBytes("10k file size"),"application/vnd.xls");
file.FileDownloadName = "test.xls";
return file;
}
}
和当然,ajax形式
<% var form = Ajax.BeginForm(...) %>
<input type="image" src="...gif" /> // this is my 1st attempt
<%= Ajax.ActionLink(...) %> // 2nd attempt
<% form.EndForm(); %>
问。如何使用AsyncController创建一个漂亮的文件
问。如何使Ajax.ActionLink变得更好
答案 0 :(得分:5)
您无法使用Ajax从服务器下载文件。这样做的原因是,即使您成功在success
回调中向服务器发出异步请求,您也将获得从服务器发送的文件内容,并且您无法在客户端对此文件执行太多操作。请记住,javascript无法访问文件系统,因此您无法保存它。实现此目的的方法是使用普通的HTML <form>
,它将指向Download
操作。提交此表单后,将要求用户选择要保存文件的位置,然后继续下载。此外,您不需要AsyncController。
以下是一个例子:
public class FileController : Controller
{
[HttpPost]
public ActionResult Download()
{
return File(
Encoding.UTF8.GetBytes("10k file size"),
"application/vnd.xls",
"test.xls"
);
}
}
并在您的视图中:
<% using (Html.BeginForm("download", "file", FormMethod.Post)) { %>
<input
type="image"
src="<%: Url.Content("~/content/images/download.png") %>"
value="download"
alt="download"
/>
<% } %>
为了使下载按钮看起来不错,您可以创建一个漂亮的 download.png
图像,该图像将用作表单提交按钮。
答案 1 :(得分:3)
我用这个:
禁用
$('form').removeAttr("data-ajax");
启用
$('form').attr("data-ajax", "true");
表示3提交1以刷新2下载文件 所有发布到相同的ActionResult但其中2个有下载为csv或pdf
的参数下载时只需禁用ajax提交。
答案 2 :(得分:0)
我找到了办法!
只需创建具有常规表单的iframe并使用jquery来触发。
$("iframe").contents().find("form").submit();
:d
感谢Firebug + Google Doc。