我有以下ASP.NET 4代码,我发现我尝试转换为ASP.NET 5 RC1 / ASP.NET Core
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控制台不会抛出任何错误。
答案 0 :(得分:0)
你可以试试这个:
public async Task MyActionName(MyViewModel viewModel)
{
//some stuff
int accountId=1;
string _contentDisposition = string.Format("attachment; filename=portfolio-inquiry-{0}.xlsx", accountId.ToString());
Response.Clear();
Response.BufferOutput = true;
Response.Buffer = true;
Response.AddHeader("content-disposition", _contentDisposition);
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.BinaryWrite(_xlPackage.GetAsByteArray());
Response.End();
//redirect to where you want to be seen in view.
return Redirect("Index");
}
答案 1 :(得分:0)
我做了一些非常愚蠢的事。
我的表单启用了不显眼的ajax,我从未处理过返回ajax返回。
如果文件被退回,您不需要进行正常POST的ajax POST。
我将表单更改为
<form action="@(Url.Action("MyActionName", "Controller"))" data-ajax="true" data-ajax-method="POST" method="post">
到
<form action="@(Url.Action("MyActionName", "Controller"))" method="post">
并且有效