asp.net core загрузить файл excel и сообщения

Мне нужно вызвать результат действия для создания и загрузки файла Excel, но я хотел бы показать сообщение, если что-то пойдет не так. Это ASP.NET Core 2.

Генерация не является проблемой, а также загрузка, но у меня есть проблемы с тем, как вызвать это действие и показать сообщение при возникновении ошибки.

Чтобы скачать файл, я обычно делаю:

[HttpGet]
public IActionResult MyFileDownload(int id)
{
    if (id == 0) MESSAGE;

    var filePath = GenerateAndSaveExcel(id);
    if (string.IsNullOrEmpty(filePath)) MESSAGE;

    using (var webClient = new System.Net.WebClient())
    {
        return File(new MemoryStream(webClient.DownloadData(filePath)), "application/pdf", "myfile.xlsx");
    }
}

Функция GenerateAndSaveExcel просто создает новый файл Excel, используя ClosedXml (если кому-то интересно, я могу поделиться тем, что я делаю) и возвращает путь к новому файлу.

Я вызываю функцию следующим образом:

<a asp-action="MyFileDownload" asp-controller="myController">download</a>

Но я хотел бы изменить способ вызова функции, потому что, если id=0 или что-то пойдет не так в функции генерации, я бы хотел отправить сообщение, обычно я использую для этого сын и показываю его с помощью javascript.

Это может быть так просто, но я не вижу способа сделать это. Возможно, вызов Ajax мог бы решить эту проблему, но я не знаю, как управлять загрузкой.

Другое дело, что мне нравится скачивать таким образом, чтобы файл сразу попадал в папку для скачивания.

Спасибо.


person John Mathison    schedule 20.09.2018    source источник


Ответы (1)


Обратите внимание, что возвращаемый IActionResult вашим методом действия — это просто интерфейс, представляющий результат действия. Когда объект результата будет выполнен, IActionResult вызовет следующий метод объекта результата и запишет в ответ.

Task ExecuteResultAsync(ActionContext context);

File() в вашем коде — это не более чем вспомогательный метод, возвращающий FileStreamResult, который является реализацией IActionResult.

Так что просто вернуть экземпляр IActionResult будет нормально:

if (id == 0) return new ContentResult(){ 
    Content="not a valid id",
    // ContentType="application/plaintext",  
};

var filePath = GenerateAndSaveExcel(id);
if (string.IsNullOrEmpty(filePath)) return new ContentResult(){ 
    Content="foo bar",
    // ContentType="application/plaintext",  
};

using (var webClient = new System.Net.WebClient())
{
    return File(new MemoryStream(webClient.DownloadData(filePath)), "application/pdf", "myfile.xlsx");
}

Если вы хотите вернуть результат json, просто верните

new JsonResult(new {
    foo="Foo",
    bar="Bar"
})

Или, если вы хотите, чтобы страница 404 оставалась обработанной по умолчанию:

вернуть новый StatusCodeResult(404);

person itminus    schedule 21.09.2018