#c# #ajax
#c# #ajax
Вопрос:
Я возвращаю файл PDF или XLSX в браузер. Я делаю это, устанавливая responseType объекта ajax, который инициировал запрос на ‘blob’. Похоже, это работает по мере необходимости. У меня возникли проблемы с поиском хорошего способа передачи строки ошибки в браузер в случаях, когда файл не удалось создать.
Если я не задаю никакого responseType для объекта ajax, я могу прочитать текст ответа как заданную мной строку ошибки meaninful. Это, однако, означает, что я больше не могу правильно прочитать ответ в виде файла PDF или XLSX в тех случаях, когда все происходило должным образом. И, конечно, я не могу установить responseType объекта ajax после получения ответа.
Контроллер
public ActionResult GetFile() {
// process work, set stream and success bool
if (wasSuccessful) {
return File(stream, "application/pdf");
}
else {
return Content("a meaningful error for the UI");
}
}
cshtml
function getFile(e, extension) {
var xhr = new XMLHttpRequest();
xhr.open('POST', e.value, true);
xhr.responseType = 'blob';
xhr.setRequestHeader('Content-Type', "application/x-www-form-urlencoded");
xhr.onload = function (ee) {
if (this.status == 200) {
var a = document.createElement("a");
document.body.appendChild(a);
a.style = "display: none";
var blob = new Blob([this.response], { type: 'octet/stream' }), url = window.URL.createObjectURL(blob);
a.href = url;
a.download = "file." extension;
a.click();
window.URL.revokeObjectURL(url);
}
};
xhr.send($("#form").serialize());
}
Могу ли я заставить свой ajax ожидать большой двоичный объект, но каким-то образом прочитать простую строку в определенных условиях ошибки?
Комментарии:
1. Просто используйте блок if / else на основе
responseType
2. Мне нужно установить responseType в ‘blob’, чтобы иметь возможность правильно использовать файл. Это означает, что responseType — это ‘blob’ и что я не могу его включить.
3. Ваш код контроллера показывает, что вы возвращаете
Content
результат, который, вероятно, будет иметьresponseType
значение «текст»… Если у вас ошибка, предположительно, у вас не будет файла для загрузки…4. В случае ошибки верните другой код состояния HTTP с сервера, тогда вы сможете обработать ошибку, а не пытаться обработать условно «успешный» ответ другими способами
5. @HereticMonkey Я могу задать тип ответа для этого ответа содержимого, но если для запроса ajax установлен тип ответа ‘blob’, то тип ответа будет ‘blob’ независимо от того, какой тип ответа я установил для содержимого. И если я не установлю для него значение blob в запросе ajax, я не смогу правильно прочитать файл.