2016-02-24 4 views
1

Как загрузить файл с помощью Ajax в MVC. Если нет данных для генерации файла, тогда показывается метка ошибки. Я пытаюсь использовать метод результата действия, который возвращает файл. Я могу скачать файл. но не хотите обновлять страницу, если файл не загружается. Мой код подобенЗагрузить файл excel с помощью Ajax MVC

public ActionResult Excel(MyViewModel model) 

{ 

    var result = // DB call to get data 

    if (no data) 
    { 
     return **something** 
    } 
    else 
    { 
   byte[] excelContent =//passing result to my method(returns xls file in byte) 

     return File(
                    excelContent, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", 
                    reportName + " Report " + startDate + " - " + endDate + ".xlsx"); 
    } 
} 

Что я должен вернуться к что-то Сейчас я возвращаюсь emptyResult для то поэтому я получил пустую страницу, если нет данных. Ajax не поддерживает загрузку файла. Этот код работает, если я отправляю форму и есть данные. Предложите то, что страница не будет обновляться, и обе задачи будут достигнуты. скачать 1. Файл, если данные 2. Показать метка ошибки, если нет данных

ответ

0
  1. Если получить файл с помощью Ajax, то лучший способ для создания API
  2. Функция возвращает тип не является FileResult

    var exportToExcel = function (inputData, fileName) { 
    var path = "url"; 
    var form = $("<form></form>"); 
    form.attr("enctype", "application/x-www-form-urlencoded"); 
    form.attr("method", "post"); 
    form.attr("action", path); 
    form.attr("accept-charset", "UTF-8"); 
    
    var field = $("<input></input>"); 
    field.attr("type", "hidden"); 
    field.attr("name", "data"); 
    field.attr("value", escape(JSON.stringify(inputData))); 
    
    form.append(field); 
    var field2 = $("<input></input>"); 
    
    field2.attr("name", "fileName"); 
    field2.attr("value", fileName); 
    form.append(field2); 
    $(document.body).append(form); 
    form.submit().remove(); 
    

    } ;

    вар DownloadFile = функция (inputData) {// checkFileHasResult является результатом Ajax вызова, если истина или ложь checkFileHasResult (inputData) .Затем (функция (hasFile) { , если (hasFile === истина) {// указать имя файла с расширением exportToExcel (inputData, "asdfasdf.csv"); } }); };

0

Выполнение срочного поиска в Google, собрало немало результатов, так как this вопрос.

В JQuery вы можете просто указать вам «window.location» вашему методу действий в контроллере, который возвращает FileResult. Это загрузит файл для вас.

Я бы предположил, что вы возвращаете сообщение на вызов ajax, указав, была ли ваша загрузка успешной или нет, и затем вы можете установить какой-то текст на лицевой стороне, чтобы уведомить пользователя о том, что этот процесс не увенчался успехом.

Вот как бы я это сделал. Вы можете настроить его, чтобы работать на вас. Вот пример методов контроллера.

[HttpGet] 
public JsonResult ExportCollection() 
{ 
    //Build your excel file, and save it to disk somewhere on server. 
    //you can also save it in session, depending on size 
    //Build up response Messages based on success or not 

    //return json object with your file path 
    return Json(new { responseMessage = responseMessage }, JsonRequestBehavior.AllowGet); 
} 

public ActionResult Download(string fileName) 
{ 
    return File(model.FilePath, "application/vnd.ms-excel", fileName); 
} 

А затем вызовите эти действия с клиентской стороны, используя JQuery и вызов Ajax.

$(document).on("click", "#YourButton", function() { 
     var url = "/YourController/ExportCollection/" 

     $("#responseText").text("We're getting things ready. Please wait..."); 
     $('#loadingImage').show(); 

     $.ajax({ 
      url: url, 
      type: "get", 
      success: function (responseMessage) { 
       patientCollectionExportSuccess(responseMessage); 
      } 
     }); 
    }) 

//Function responsible for exporting 
function patientCollectionExportSuccess(dataReceived) { 
    var respMessage = dataReceived.responseMessage; 

    if (respMessage != null) { 
     if (respMessage != "Error: Not Exported.") { 

      $("#responseText").text("Download completed."); 
      $('#loadingImage').hide(); 

      //set window.location to redirect to FileResult, which will download file 
      window.location = '/PatientListingQuery/Download?fileName=' + respMessage ; 
     } 
     else { 
      $("#responseText").text("Download unsuccessful."); 
      $('#loadingImage').hide(); 

      $("#responseText").text(dataReceived.responseMessage); 
     } 

    } 
} 
+0

Есть ли альтернатива вместо сохранения файла? – Dev

+0

Вы можете сохранить файл в TempData, например. Но когда пользователь обновляет страницу по какой-либо причине, файл, я считаю, исчезнет. Возможно, лучше сохранить на диск, и после загрузки вы сможете снова удалить файл с диска. –

0

Спасибо ребята

Я получил решение Это работает для меня гладко ....

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

$(document).ready(function() { 
    $('#excel-button').on('click', function() {    
     $.ajax({ 
      url: '/MyController/IsData', 
      type: 'POST', 
      data: $("#myForm").serialize(), 
      success: function (response) { 
       if (response == "True") { 
        var oldUrl=""; 
        var form1 = $('#myForm'); 

        var frm = document.getElementById('myForm') || null; 
        if (frm) { 
          oldUrl = frm.action; 
         frm.action = '/MyController/GenerateExcel'; 
        } 

        form1.submit(); 
        frm.action = oldUrl; 
        $('.error-Message').hide(); 

       }     else {       

        $('.error-Message').show(); 

       } 
      } 
    }); 
    }); 
Смежные вопросы