C# 从控制器RedirectToAction()下载文件
我有一个旧的MVC1.0应用程序,我正在努力解决一些相对简单的问题C# 从控制器RedirectToAction()下载文件,c#,asp.net-mvc,C#,Asp.net Mvc,我有一个旧的MVC1.0应用程序,我正在努力解决一些相对简单的问题 我有一个允许用户上传文件的视图 一些服务器端处理继续进行 最后,生成一个新文件并自动下载到客户机 我有第1步和第2步。我无法完成工作的最后一步。这是我的控制器: [AcceptVerbs(HttpVerbs.Post)] public ViewResult SomeImporter(HttpPostedFileBase attachment, FormCollection formCollection, string submi
[AcceptVerbs(HttpVerbs.Post)]
public ViewResult SomeImporter(HttpPostedFileBase attachment, FormCollection formCollection, string submitButton, string fileName
{
if (submitButton.Equals("Import"))
{
byte[] fileBytes = ImportData(fileName, new CompanyExcelColumnData());
if (fileBytes != null)
{
RedirectToAction("DownloadFile", "ControllerName", new { fileBytes = fileBytes});
}
return View();
}
throw new ArgumentException("Value not valid", "submitButton");
}
public FileContentResult DownloadFile(byte[] fileBytes)
{
return File(
fileBytes,
"application/ms-excel",
string.Format("Filexyz {0}", DateTime.Now.ToString("yyyyMMdd HHmm")));
}
代码执行:
RedirectToAction("DownloadFile", "ControllerName", new { fileBytes = fileBytes});
但是该文件没有下载。欢迎提出建议并提前表示感谢。尝试返回,因为它是动作输出中最抽象的类。ViewResult将强制您返回一个视图或PartialView,因此,返回一个文件将得到一个关于隐式转换类型的异常
[HttpPost]
public ActionResult SomeImporter(HttpPostedFileBase attachment, FormCollection formCollection, string submitButton, string fileName
{
if (submitButton.Equals("Import"))
{
byte[] fileBytes = ImportData(fileName, new CompanyExcelColumnData());
if (fileBytes != null)
{
return File(
fileBytes,
"application/ms-excel",
string.Format("Filexyz {0}", DateTime.Now.ToString("yyyyMMdd HHmm")));
}
return View();
}
throw new ArgumentException("Value not valid", "submitButton");
}
你为什么要采取行动?您可以从SomeImporter操作返回文件,只需将SomeImporter的返回类型更改为FileContentResult。
RedirectToAction
将HTTP重定向发送到浏览器,因此无法传递文件数据。你可以直接返回File()
来代替重定向吗?你也可以将数据放入TempData
(假设它在版本1中…不记得了)我已经尝试返回File()
而不是RedirectToAction
,但它也不起作用。当您说将字节[]
放入TempData
时,如何从控制器的SomeImporter()
下载它?返回文件()
做了什么?有错误吗?要使用TempData
,您需要将字节放入其中TempData[“foo”]=fileBytes
,执行重定向,然后在下载操作中从中取出字节。好的……您还可以尝试返回ActionResult
,而不是ViewResult
。哦。。我在早些时候的旅行中读到了这一点。我不知道为什么我没有尝试。谢谢