2017-10-20 153 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

相关问题