我已经我发现下面的ASP.NET 4代码,我试图转换为ASP.NET 5 RC1/ASP.NET核心文件没有返回到ASP.NET MVC视图,但我看不出为什么?
public async Task MyActionName(MyViewModel viewModel)
{
//some stuff
int accountId=1;
string _contentDisposition =
string.Format("attachment; filename=portfolio-inquiry-{0}.xlsx",
accountId.ToString());
Response.ContentType =
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("content-disposition", _contentDisposition);
Response.BinaryWrite(_xlPackage.GetAsByteArray());
}
有一个GitHub answer posted,说了ASP.NET 5我需要使用
await context.Response.Body.WriteAsync(buffer, 0, buffer.Length);
所以我改变它为ASP.NET 5(不知道这是否是正确的)
public async Task MyActionName(MyViewModel viewModel)
{
//some stuff
int accountId=1;
string _contentDisposition =
string.Format("attachment; filename=portfolio-inquiry-{0}.xlsx", accountId.ToString());
var buffer = _xlPackage.GetAsByteArray();
await HttpContext.Response.Body.WriteAsync(buffer, 0, buffer.Length);
}
我的看法是这样的
<form action="@(Url.Action("MyActionName", "Controller"))" data-ajax="true" data-ajax-method="POST" method="post">
//form inputs
<button type="submit" class="btn btn-primary">Get file</button>
</form>
并且代码无错地运行。然而,因为HttpContext.Response.Body.WriteAsync
或旧的返回是无效的,我不知道如何将它返回到我的MVC视图,因为上述代码正确运行,但因为它不返回任何视图,视图不会得到文件。
我已经运行Fiddler来查看是否有任何东西从控制器发送到浏览器,但没有任何东西。在Visual Studio中,我可以遍历所有代码。 我认为一个可能的问题是,因为ASP.NET 5没有Response.AddHeader
方法,所以我排除该行以查看它是否仍然有效。
然后我试图通过chaning
return File(buffer, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
将其转换为一个文件,并发送回视图,并改变了我的方法的返回类型为async Task<FileResult>
。
但是结果仍然是一样的。通过控制器编码步骤,但不返回任何内容到视图。提琴手什么都没收。调试没有错误。 JavaScript控制台不会引发错误。
您正在下载的文件作为附件,你不应该需要将其返回到视图。没有Ajax的正常表单提交应该为此工作。 – Rhumborl
[将文件返回到ASP.NET MVC中查看/下载]可能的重复(http://stackoverflow.com/questions/5826649/returning-a-file-to-view-download-in-asp-net-mvc ) –
使用[File](https://msdn.microsoft.com/en-us/library/system.web.mvc.controller.file(v = vs.118).aspx)方法重载之一返回FileResult 。视图仅用于渲染。当您想要返回Json,文件或其他表示形式时,您需要返回适当的Result实例 –