如何在AsyncControl中下载MVC文件?

时间:2011-01-15 21:25:46

标签: asp.net-mvc asp.net-mvc-2 download

我有

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(); %>
  1. 我尝试第一种方法(输入类型=图像)。它达到了正确的行动。但客户端没有文件下载。
  2. 然后我尝试使用我真的很讨厌的Ajax.ActionLink。我想要漂亮的图像按钮,而不是链接文本。再次,它达到正确的行动,没有文件下载。但如果我在另一个窗口打开链接,那就有文件下载!!
  3. 问。如何使用AsyncController创建一个漂亮的文件

    问。如何使Ajax.ActionLink变得更好

3 个答案:

答案 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。