У меня есть следующий код 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, в котором говорится, что для 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, поэтому я исключил эту строку, чтобы посмотреть, работает ли она по-прежнему.

Затем я попытался преобразовать его в файл и отправить обратно в представление, изменив

 return File(buffer, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

И изменил тип возвращаемого значения моего метода на async Task<FileResult>.

Однако результат все тот же. Код проходит через контроллер, но ничего не возвращает в представление. Fiddler ничего не поднимает. Отладка не обнаруживает ошибок. Консоль JavaScript не выдает ошибок.

0
greay 1 Мар 2016 в 06:53

2 ответа

Лучший ответ

Я сделал что-то действительно глупое.

В моей форме был включен ненавязчивый ajax, и я никогда не обрабатывал возврат ajax return.

Если файл возвращается, вам не нужно делать ajax POST, подойдет обычный POST.

Я изменил свою форму на

 <form action="@(Url.Action("MyActionName", "Controller"))" data-ajax="true" data-ajax-method="POST" method="post">

К

 <form action="@(Url.Action("MyActionName", "Controller"))" method="post">

И это работает

0
greay 1 Мар 2016 в 12:07

Вы можете попробовать это:

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"); 
}
0
jomsk1e 1 Мар 2016 в 09:50