Asp.net ядро ​​скачать файл Excel и сообщения - PullRequest
0 голосов
/ 20 сентября 2018

Мне нужно вызвать Результат действия для генерации и загрузки файла 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 или что-то идет не так в генерацииЯ хотел бы отправить сообщение, обычно я использую son для этого и показываю его с помощью javascript.

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

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

Спасибо.

1 Ответ

0 голосов
/ 21 сентября 2018

Обратите внимание, что возвращаемое 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);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...