文件未返回到ASP.NET MVC View,但我看不清楚原因?

时间:2016-03-01 03:53:29

标签: asp.net-mvc asp.net-core asp.net-core-mvc

我有以下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控制台不会抛出任何错误。

2 个答案:

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

并且有效