/ / AJAX Opublikuj, aby pobrać plik za pomocą MVC - .net, ajax, model-view-controller, response

AJAX Post, aby pobrać plik za pomocą MVC - .net, ajax, model-view-controller, response

Muszę to zrobić, ponieważ strona, z którą pracuję, ma już <form> składanie w obszarze, więc muszę użyć AJAX, aby ominąć <form> within a <form> problem.

Problem polega na tym, że mój plik nie jest wysyłany na stronę internetową, moja strona ma status odpowiedzi 200 OK, ale żaden plik nie jest wysyłany.

Wywołanie AJAX w Responses.vbhtml:

function exportCsv()
{
var formExportSettings = new Object();
var responseIdsList = [];
formExportSettings.formId = "@Model.form.formId.ToString()";
formExportSettings.exporttype = "csv";
formExportSettings.format = $("input[name=export-format]:checked").val();
formExportSettings.startDate = $("input[id=exportstartdate]").val();
formExportSettings.endDate = $("input[id=exportenddate]").val();

$("input[name=responseId]:checked").map(function() {
responseIdsList.push($(this).val());
});

formExportSettings.responseIds = responseIdsList;
var jsonData = JSON.stringify(formExportSettings);
$.ajax({
url: "/Forms/ExportCsv",
type: "POST",
dataType: "json",
data: jsonData,
contentType: "application/json; charset=utf-8",
success: function (success) {
// never get the success message
var message = success;
console.log(message);
}
});
}

Działanie kontrolera MVC:

   Function ExportCSV(model As FormsExportSettings) As ActionResult
Dim exportModel As FormsExportModel = New FormsExportModel(model)

Try
Dim fileName = exportModel.form.formName + ".csv"

Response.Clear()
Response.Buffer = True
Response.ClearContent()
Response.ClearHeaders()
Response.ContentType = "text/csv"
Response.AddHeader("Content-Disposition", "attachment;filename=" & fileName)
Response.BinaryWrite(exportModel.writer.ExportToBytes())
Response.Flush()
Response.End()

Catch ex As Exception

End Try
End Function

The writer w powyższej sekcji (exportModel.writer.ExportToBytes()) jest typu CsvExport() który eksportuje moje Csv jako surowe bajty UTF8.

EDYTOWAĆ: Właśnie zauważyłem, że otrzymuję plik CSV jako Response. W przeglądarce Chrome mogę otworzyć konsolę programisty, przejść do sieci i wyświetlić odpowiedź, a także wyświetlić tekst pliku CSV. To po prostu nie daje mi możliwości zapisania go.

Odpowiedzi:

0 dla odpowiedzi № 1

Zamiast bezpośrednio pisać odpowiedź, chciałbym spróbować czegoś takiego:

Function ExportCSV(model As FormsExportSettings) As FileContentResult
Dim exportModel As FormsExportModel = New FormsExportModel(model)

Dim fileName = exportModel.form.formName + ".csv"

Return File(exportModel.writer.ExportToBytes(), "text/csv", fileName)
End Function

Funkcja File obsłuży wszystkie ustawienia nagłówków i odpowiedzi i zwróci plik do pobrania.