Pobierz plik Excela w żądaniu JQuery-AJAX z ASP.NET MVC


W moim projekcie ASP.NET MVC wygenerowałem plik Excela przy użyciu

ClosedXML
http://closedxml.codeplex.com/
.
Działa dobrze w wywołaniach innych niż Ajax. Oto moja metoda akcji kontrolera
// Prepare the response
Response.Clear();
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("content-disposition", "attachment;filename=\"" + reportHeader + ".xlsx\"");// Flush the workbook to the Response.OutputStream
using (MemoryStream memoryStream = new MemoryStream())
{
MyWorkBook.SaveAs(memoryStream);
memoryStream.WriteTo(Response.OutputStream);
memoryStream.Close();
}
Response.End();

Teraz próbuję to zrobić za pomocą żądania AJAX. Ale plik nie jest wysyłany z kontrolera MVC.
$.ajax({
url: url,
type: "POST",
data: fd,
processData: false,
contentType: false,
beforeSend: function () {
},
success: function (response) { },
error: function (request, status, error) {
},
complete: function () {
}
});

W jaki sposób mogę to zrobić?
Z góry dziękuję.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Dlaczego nie?
Ramiramilu miał rację co do używania
window.location
i
iframe
.
Zrobiłem to samo, ale dla ASP.NET MVC3.
Sugerowałbym użycie kontrolera, który zwraca
FileContentResult
Do Twojej wiadomości na temat
FileContentResult

MSDN
https://msdn.microsoft.com/en- ... esult(v=vs.118).aspx
I na koniec jak to zrobiłem (kontroler):
[HttpPost]
public HttpStatusCodeResult CreateExcel()
{
XLWorkbook wb = new XLWorkbook(XLEventTracking.Disabled);//create Excel//Generate information for excel file
// ... if (wb != null)
{
Session["ExcelResult"] = wb;
return new HttpStatusCodeResult(HttpStatusCode.OK);
} return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } [HttpGet]
public FileContentResult ExcelResult(string reportHeader)//it's your data passed to controller
{ byte[] fileBytes = GetExcel((XLWorkbook)Session["ExcelResult"]);
return File(fileBytes, MediaTypeNames.Application.Octet, reportHeader + ".xlsx");
}

W modelu (możesz usunąć statykę, jeśli chcesz, i zadzwoń go za pomocą instancji)
public static byte[] GetExcel(XLWorkbook wb)
{
using (var ms = new MemoryStream())
{
wb.SaveAs(ms);
return ms.ToArray();
}
}

AJAX:
$.ajax({
url: "@Url.Action("CreateExcel")",
async: true,
type: "POST",
traditional: true,
cache: false,
statusCode: {
400: function () {
alert("Sorry! We cannot process you request");
},
200: function () {
$("#fileHolder")
.attr('src',
'@Url.Action("ExcelResult")?reportHeader=' +
reportHeader);
}
}
});

Przy okazji, usunąłem wszystkie programy obsługi wyjątków, aby uprościć sprawę, ale myślę, że możesz to zrobić samodzielnie.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Nie możesz

DIRECTLY

załaduj plik za pomocą AJAX, ale możesz załadować plik za pomocą
window.location
w połączeniu z AJAX, aby przesłać plik. To znaczy, jeśli używasz AJAX GET/POST, to cała zawartość pliku będzie w pamięci przeglądarki, ale nie będzie można jej zapisać na dysku (ze względu na ograniczenia JavaScript).
Zamiast tego można użyć
Window.Lokalizacja
, aby określić adres URL, który z kolei usunie plik i podpowiedzi/otworzyć zaproszenie. Lub można użyć ukrytych iframe i ustaw src atrybut iframe z adresem URL, z którego zostanie pobrany plik.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się