2017-10-20 54 views
0

我有一個返回excel文件的操作方法。我正在使用ajax調用該操作方法。我得到Requested JSON parse failed在下載excel文件時出現「請求的JSON解析失敗」錯誤

$.ajax({ 
      url: importUrl, 
      data: { 
       X: "12", 
       Y: "12", 
       Z: "12" 
      }, 
      success: function (data) { 
       alert("S: "+data); 
      }, 
      error: function (jqXHR, exception) { 
       var msg = ''; 
       if (jqXHR.status === 0) { 
        msg = 'Not connect.\n Verify Network.'; 
       } else if (jqXHR.status == 404) { 
        msg = 'Requested page not found. [404]'; 
       } else if (jqXHR.status == 500) { 
        msg = 'Internal Server Error [500].'; 
       } else if (exception === 'parsererror') { 
        msg = 'Requested JSON parse failed.'; 
       } else if (exception === 'timeout') { 
        msg = 'Time out error.'; 
       } else if (exception === 'abort') { 
        msg = 'Ajax request aborted.'; 
       } else { 
        msg = 'Uncaught Error.\n' + jqXHR.responseText; 
       } 
       console.log(msg); 
      } 
     }); 



public ActionResult ExportReportToExcel(string X, string Y, string Z) 
     { 
      if (HttpContext.Request.UrlReferrer == null) 
       TempData["PDFPrevUrl"] = Url.RouteUrl("PageNotFound"); 
      else if (TempData["PDFPrevUrl"] == null) 
       TempData["PDFPrevUrl"] = HttpContext.Request.UrlReferrer.PathAndQuery; 

      var customer = _authenticationService.CurrentCustomer; 
      if (customer == null) 
       return new LmsHttpUnauthorizedResult(); 

      string filename = "Report"; 
      try 
      { 
       XLWorkbook wb = new XLWorkbook(Server.MapPath(@"~/Content/CumulativePerformanceReportTemplate.xlsx")); 
       XElement userprogress = XElement.Load(Server.MapPath(@"~/Content/Export.xml")).Element("cumulativeperformancereport"); 
       int datarow = int.Parse(userprogress.Element("T").Attribute("row").Value.Trim()); 
       int datacol = int.Parse(userprogress.Element("T").Attribute("col").Value.Trim()); 
       IXLWorksheet WS = wb.Worksheet(1); 
       WS.Cell(datarow, datacol).Value = customer.Name; 
       datarow = int.Parse(userprogress.Element("X").Attribute("row").Value.Trim()); 
       datacol = int.Parse(userprogress.Element("X").Attribute("col").Value.Trim()); 
       WS.Cell(datarow, datacol).Value = X; 
       datarow = int.Parse(userprogress.Element("Y").Attribute("row").Value.Trim()); 
       datacol = int.Parse(userprogress.Element("Y").Attribute("col").Value.Trim()); 
       WS.Cell(datarow, datacol).Value = Y; 
       datarow = int.Parse(userprogress.Element("Z").Attribute("row").Value.Trim()); 
       datacol = int.Parse(userprogress.Element("Z").Attribute("col").Value.Trim()); 
       WS.Cell(datarow, datacol).Value = Z; 
       Response.Clear(); 
       Response.Buffer = true; 
       Response.Charset = ""; 
       Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
       Response.AddHeader("content-disposition", "attachment;filename=" + filename + "_Summary.xlsx"); 
       using (MemoryStream MyMemoryStream = new MemoryStream()) 
       { 
        wb.SaveAs(MyMemoryStream); 
        MyMemoryStream.WriteTo(Response.OutputStream); 
        Response.Flush(); 
        Response.End(); 

       } 
       return null; 
      } 

      catch (Exception ex) 
      { 
       return Redirect(TempData["PDFPrevUrl"].ToString()); 
      } 

     } 

爲什麼我得到這個錯誤?

+0

確定控制器動作應該'回報null'?另外X在這裏的數據參數聲明瞭兩次,可能是這導致了分析錯誤:'data:{X:「12」,Y:「12」,X:「12」},'。 –

+0

@Tetsuya Yamamoto那是排版。我做了一些更正。是的,我確定控制器操作應該返回null。 – Sonali

回答

0

爲什麼使用後端的東西像創建一個Excel文件&然後下載它....其矯枉過正&下載部分difficut

使用的東西,重量輕如JavaScript在客戶端...這將創建EXCEL從XML &將下載使用download 財產......

var data_type = 'data:application/vnd.ms-excel'; 
    var table_div = document.getElementById('table_wrapper'); 
    var table_html = table_div.outerHTML.replace(/ /g, '%20'); 

Here is Solution

0

發送文件可能是服務器端錯誤。 您是否嘗試過更改回復內容類型application/vnd.ms-excel


我告訴你一個最小的工作示例

// Server side 
public ActionResult GimmeFile() 
{ 
    var bytes = System.IO.File.ReadAllBytes(@"path_to_your_file.xlsx"); 
    return File(bytes, "application/vnd.ms-excel", "Myfile.xls"); 
} 

客戶端與你的Ajax調用

$.ajax({ 
    method: 'POST', 
    url: '/Home/GimmeFile', 
    success: function (data) { 
     alert("S: " + data) 
    }, 
    error: function (jqXHR, ex) { 
     console.log(ex) 
    } 
}) 

反正,我不知道你需要做什麼ajax調用後的excel文件, 但如果您需要將其保存到本地,則應使用HTML5 < a download>而不是

+0

如何下載此數據我們得到 – Sonali

+0

由於JavaScript的安全限制,從網頁上將文件保存到文件系統並不是一件簡單的方法。 - 您可以將文件保存到瀏覽器的[本地存儲](http://www.w3schools。 COM/HTML/html5_webstorage.asp) - 或查看[庫](http://jquery.tiddlywiki.org/twFile.html) 或者你可以使用HTML標籤< a download>,我 –

+0

前面提到我想下載這個文件。那麼使用這個有什麼意義呢? – Sonali

0

請求的JSON解析失敗」表示AJAX調用期望獲取JSON數據作爲返回值,但控制器操作方法返回的數據類型不是JSON對象。

通過審查控制流量和忽略了一些不相關的代碼,你會得到這樣的:

public ActionResult ExportReportToExcel(string X, string Y, string Z) 
{ 
    // other stuff 

    var customer = _authenticationService.CurrentCustomer; 
    if (customer == null) 
     return new LmsHttpUnauthorizedResult(); 

    try 
    { 
     // other stuff 

     return null; // this returns null value instead of expected JSON 
    } 

    catch (Exception ex) 
    { 
     return Redirect(TempData["PDFPrevUrl"].ToString()); 
    } 

} 

默認情況下,jQuery的嘗試基於MIME類型的響應(XML,JSON腳本來推斷dataType說法或html,最近的默認是JSON)。因此,你需要return a JSON object通過下面這些方法:

// ContentResult 
return Content("message_text", "application/json"); 

// JsonResult 
return Json("message_text", JsonRequestBehavior.AllowGet); 

如果您想通過AJAX返回要下載的文件,你可以使用window.locationwindow.location.href重定向:

$.ajax({ 
     url: importUrl, // this should be refer to JsonResult action 
     data: { 
      X: "12", 
      Y: "12", 
      Z: "12" 
     }, 
     success: function (data) { 
      // deal with data response here 
      window.location = downloadUrl; // redirect to FileResult action 
     }, 
     error: function (jqXHR, exception) { 
      // other stuff 
     } 
} 

// example controller to return Excel binary file 
public FileResult DownloadFile(string fileName) 
{ 
    // other stuff 
    byte[] content = TempData["something"] as byte[]; 

    return File(content, "application/vnd.ms-excel", fileName); 
} 

注:以上的解釋是大多是微不足道的,您目前的實施可能與給定的例子不同。

類似的問題:

Download Excel file via AJAX MVC

jQuery returning "parsererror" for ajax request

相關問題