2015-03-25 3 views
0

Мне нужно сделать это, потому что страница, с которой я работаю, уже имеет представление <form> в этом районе, поэтому мне нужно использовать AJAX, чтобы обойти проблему <form> within a <form>.AJAX Опубликовать, чтобы скачать файл с помощью MVC

Проблема в том, что мой файл не отправляется на веб-страницу, моя страница получает статус ответа 200 OK, но файл не отправляется.

АЯКС вызова на 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); 
      } 
     }); 
    } 

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 

writer в приведенном выше разделе (exportModel.writer.ExportToBytes()) имеет тип CsvExport(), который экспортирует мой Csv как сырые байты UTF8.

EDIT: Я только заметил, что я получать файл CSV в качестве Response. В Chrome я могу вытащить консоль dev, перейти в Network и просмотреть Response, и я вижу текст CSV-файла. Это просто не дает мне возможность сохранить его.

+1

MVC + пример jQuery: http://stackoverflow.com/a/21464346/423430 – user423430

+0

Это кажется полезным, но похоже, что он не использует стандартный метод .ajax. – MaylorTaylor

ответ

0

Вместо того, чтобы писать ответ непосредственно, я хотел бы попробовать что-то вроде этого:

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 

Функция Файл будет обрабатывать все настройки заголовков и ответа и возвращает файл для загрузки.

+0

Я тоже пробовал этот метод, и он дает мне те же результаты, что и OP – MaylorTaylor

Смежные вопросы