2016-10-05 4 views
0

以下のコードは、FusionChartをSVG文字列に変更し、それをajax呼び出しでコントローラに渡す、 "export" liタグから開始されます。FileStreamResultがAJAX呼び出し後にPDFを保存することを要求していません

コントローラに衝突し、コードが最後まで実行され、アラートによって「成功」が表示されますが、pdfを保存するためのポップアップは表示されません。

私は...

アムを全体のHTML文字列をつかんで、メモ帳に入れて、それは必要がありますが、コントローラから実行し、保存したメッセージをポップアップする場合、単純に動作しませんよう、HTML、すべてのディスプレイとして保存しています私は何かを欠いている?または何かが間違っている、またはベストプラクティスではない何か?

私はjavascript関数を呼び出している次のことを持っている:

function svgString() { 
       var ChartSVG = new Array(10); 
       var text = document.createTextNode(savingsChart.getSVGString()); 
       document.getElementById("msg").appendChild(text); 

       ChartSVG = chunkSubstr(document.getElementById("msg").innerHTML, 10); 

       var Details = 
        { 
         "fkiProjectID" : @Model.fkiProjectID, 
         "ChartSVG": ChartSVG 
        }; 

       $.ajax({ 

        url: '/Profile/ExportCombinedPDF', 
        data: JSON.stringify(Details), 
        type: 'POST', 
        contentType: 'application/json; charset=utf-8', 
        success: function (data) { 
         alert("Success : " + data); 
        }, 
        error: function(data){ 
         alert("Error: " + data); 
        } 
       }); 
      } 

document.getElementById("export").addEventListener("click", svgString); 

function chunkSubstr(str, size) { 
      var numChunks = Math.ceil(str.length/size), 
       chunks = new Array(size); 

      //alert(str.length); 

      for(var i = 0, o = 0; i < size; ++i, o += numChunks) { 
       chunks[i] = str.substring(o, o + numChunks); 

       //alert(o + " " + numChunks); 
      } 

      return chunks; 
     } 

コントローラー:

public FileStreamResult ExportCombinedPDF(CalculatedOutputViewModel CVM) 
     { 
      List<PipelineDetails> PipeList = new List<PipelineDetails>(); 
      ProjectManager PM = new ProjectManager(); 

      PipeList = PM.GetPipelineList(CVM.fkiProjectID); 

      string webgridstyle = PM.Pipeline_HtmlForExport(CVM.fkiProjectID); 
      string ProjectHtml = PM.Project_HtmlForExport(CVM.fkiProjectID); 
      string chartcontent = ExportRotativaPDF2(CVM); 

      WebGrid grid = new WebGrid(source: PipeList, canPage: false, canSort: false); 
      string gridHtml = grid.GetHtml(tableStyle: "webGrid", 
              headerStyle: "webGridHeader", 
              alternatingRowStyle: "webGridAlt", 
        columns: grid.Columns(
        grid.Column("NodeNumber", "Node Nr."), 
        grid.Column("Accumulated_Length", "Accumulated Length"), 
        grid.Column("Elevation", "Elevation"), 
        grid.Column("Pipe_Outside_Diameter", "Pipe Outside Diameter"), 
        grid.Column("Wall_Thickness", "Wall Thickness"), 
        grid.Column("Control_Point_Description", "Control Point Description"), 
        grid.Column("Control_Point_Size", "Control Point Size"))).ToString(); 

      string exportData = String.Format("<html><body>{0}{1} <p style='page-break-after:always;'></p> {2} {3}</body></html>", "<style>" + webgridstyle + "</style>", ProjectHtml, gridHtml, chartcontent); 

      var bytes = System.Text.Encoding.UTF8.GetBytes(exportData); 
      using (var input = new MemoryStream(bytes)) 
      { 
       var output = new MemoryStream(); 
       var document = new iTextSharp.text.Document(PageSize.A4, 50, 50, 50, 50); 
       var writer = PdfWriter.GetInstance(document, output); 

       PdfPTable table = new PdfPTable(1); 

       table.HeaderRows = 1; 

       Font headerFont = FontFactory.GetFont("Verdana", 10); 
       Font rowfont = FontFactory.GetFont("Verdana", 10); 

       writer.CloseStream = false; 
       document.Open(); 

       var xmlWorker = iTextSharp.tool.xml.XMLWorkerHelper.GetInstance(); 
       xmlWorker.ParseXHtml(writer, document, input, System.Text.Encoding.UTF8); 

       document.Add(table); 
       document.Close(); 
       output.Position = 0; 

       return File(output, "application/pdf", "Pipeline_Report.pdf"); 

       //return new FileStreamResult(output, "application/pdf"); 
      } 

     } 

もし

ここ
<li id="export" style="font-size:13px"><a onclick="svgString()">Rotativa Export</a></li> 

は、AJAX呼び出しを行っている私のjavascriptのです誰も助けることができます、ありがとう!

+0

http://stackoverflow.com/a/23797348/307976 – vtortola

+0

ajaxは使用しないでください。 (ヒント:window.openメソッド) – Shyju

+0

私が座っている問題は、Javascriptを使用してFusionChartをSVG文字列に変換する必要があることです。配列に)、私は私のコントローラからpdfにエクスポートする必要があるhtml文字列を構築するために呼び出す関数を持っています。私はこのChartSVG配列をコントローラに渡すことができますが、ajax呼び出しを使用しないと、これは素晴らしいことです。これが可能ならば? – AxleWack

答えて

0

だから私はこれを整理することができたように追加します。私は少し物事をやったやりかたを変える必要があったが、最終的にはそれが働いた。

だから、次は私がやったことです:私のJavaScript関数と呼ばれ、モーダルとして部分図を表示するAJAX呼び出しを使用し、ボタンをクリックした

  1. 。モーダルは、ajax呼び出しが完了した後に開きます。
  2. この部分図では、「印刷」ボタンがあります。私はモデルを私のコントローラに送り返し、そのアクション結果の文字列を構築します。
  3. 次に、Rotativa ViewAsPdfを使用して、保存ダイアログを表示します。

正確には私が望んでいなかったが、結果はまさに私が望んでいた通りです。

コードは以下の通りです:

ビュー:

これ

<div class="modal fade" id="PrintModel" tabindex="-1" role="dialog" aria-labelledby="myPrintModalLabel"> 
    <div class="modal-dialog" role="document"> 
     <div class="modal-content"> 
      <div class="modal-header"> 
       <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button> 
       @*<h4 class="modal-title" id="myEditModalLabel">Update Pipeline Details</h4>*@ 
      </div> 
      <div class="modal-body"> 
      </div> 
      <div class="modal-footer"> 
       <button type="button" class="btn btn-default3" data-dismiss="modal">Close</button> 
      </div> 
     </div> 
    </div> 
</div> 

<div> 
    <button id="get" data-loading-text="Preparing..." type="button" class="btn btn-default2" data-dismiss="modal">Prepare for Print</button> 
</div> 

のJavaScript(FusionChart部分でレンダリングされている)の下に私のモーダルとボタンで

FusionCharts.ready(function() { 
      var savingsChart = new FusionCharts({ 
       id: 'chart-1', 
       type: "scatter", 
       renderAt: "chart-container", 
       width: "1000", 
       height: "500" 
      }); 
      savingsChart.setTransparent(false); 
      savingsChart.setXMLUrl(window.location.protocol + "//" + window.location.host + "/Profile/getGraphXMLData/" + @Model.fkiProjectID); 
      savingsChart.render("chart-container"); 

      function svgString() { 
       var ChartSVG = new Array(10); 
       var text = document.createTextNode(savingsChart.getSVGString()); 
       document.getElementById("msg").appendChild(text); 

       ChartSVG = chunkSubstr(document.getElementById("msg").innerHTML, 10); 

       //alert("Reached : Before Ajax Call"); 

       var Details = 
        { 
         "fkiProjectID" : @Model.fkiProjectID, 
         "ChartSVG": ChartSVG 
        }; 

       $.ajax({ 
        url: '/Profile/PrepareForPrint', 
        data: JSON.stringify(Details), 
        type: 'POST', 
        contentType: 'application/json; charset=utf-8', 
        success: function (data) { 
         var m = $('#PrintModel'); 
         m.find('.modal-body').html(data); 
         m.modal('show'); 

        } 
       }); 
      } 

      document.getElementById("get").addEventListener("click", svgString); 
      //document.getElementById("rotativaexport").addEventListener("click", svgString); 


     }); 

コントローラ

public ActionResult PrepareForPrint(CalculatedOutputViewModel model) 
     { 
      CalculatedOutputViewModel CVM = new CalculatedOutputViewModel(); 

      CVM.fkiProjectID = model.fkiProjectID; 
      CVM.ChartSVG = model.ChartSVG; 

      return PartialView("_partialPrintPDF", model); 
     } 

     public string ExportCombinedPDF(CalculatedOutputViewModel CVM) 
     { 
      List<PipelineDetails> PipeList = new List<PipelineDetails>(); 
      ProjectManager PM = new ProjectManager(); 

      PipeList = PM.GetPipelineList(CVM.fkiProjectID); 

      string webgridstyle = PM.Pipeline_HtmlForExport(CVM.fkiProjectID); 
      string ProjectHtml = PM.Project_HtmlForExport(CVM.fkiProjectID); 
      string chartcontent = ExportRotativaPDF2(CVM); 

      WebGrid grid = new WebGrid(source: PipeList, canPage: false, canSort: false); 
      string gridHtml = grid.GetHtml(tableStyle: "webGrid", 
              headerStyle: "webGridHeader", 
              alternatingRowStyle: "webGridAlt", 
        columns: grid.Columns(
        grid.Column("NodeNumber", "Node Nr."), 
        grid.Column("Accumulated_Length", "Accumulated Length"), 
        grid.Column("Elevation", "Elevation"), 
        grid.Column("Pipe_Outside_Diameter", "Pipe Outside Diameter"), 
        grid.Column("Wall_Thickness", "Wall Thickness"), 
        grid.Column("Control_Point_Description", "Control Point Description"), 
        grid.Column("Control_Point_Size", "Control Point Size"))).ToString(); 

      //string exportData = String.Format("<html><body>{0}{1} <p style='page-break-after:always;'></p> {2}{3}</body></html>", "<style>" + webgridstyle + "</style>", ProjectHtml, gridHtml, chartcontent); 
      string exportData = String.Format("{0}{1} <br> {2} <br> {3}", "<style>" + webgridstyle + "</style>", ProjectHtml, gridHtml, chartcontent); 

      return exportData; 

     } 

     public ActionResult DownloadPDF(CalculatedOutputViewModel CVM) 
     { 
      try 
      { 
       var model = new GeneratePDFModel(); 

       string pdfContent = ExportCombinedPDF(CVM); 

       //get the information to display in pdf from database 
       //for the time 
       //Hard coding values are here, these are the content to display in pdf 
       var content = "<h2>WOW Rotativa<h2>" + 
       pdfContent; 
       //var logoFile = @"/Images/logo.png"; 

       model.PDFContent = content; 
       //model.PDFLogo = Server.MapPath(logoFile); 

       //Use ViewAsPdf Class to generate pdf using GeneratePDF.cshtml view 
       return new Rotativa.ViewAsPdf("GeneratePDF", model) { FileName = "firstPdf.pdf" }; 
      } 
      catch (Exception ex) 
      { 
       throw; 
      } 
     } 

部分図

@model AirFlo_Size_Programme.Models.CalculatedOutputViewModel 

@{ 
    Layout = null; 
} 

<!DOCTYPE html> 

<html> 
<head> 
    <meta name="viewport" content="width=device-width" /> 
</head> 
<body> 
@using (Html.BeginForm("DownloadPDF", "Profile")) 
{ 
    for (var i = 0; i < Model.ChartSVG.Length; i++) 
    { 
     @Html.HiddenFor(model => model.ChartSVG[i]) 
    } 

    @*@Html.HiddenFor(model => model.ChartSVG)*@ 
    @Html.HiddenFor(model => model.fkiProjectID) 

    <div> 
     @if (@Model.ChartSVG == null) 
     { 
      <button type="submit" data-loading-text="Preparing..." class="edit-user display-mode btn btn-default2">Prepare for Print</button> 
     } 
     else 
     { 
      <button type="submit" data-loading-text="Printing..." class="edit-user display-mode btn btn-default2">Print</button> 
     } 
    </div> 



} 
</body> 
</html> 

私は、これは理想的ではないことを知っている...しかし、それは動作します。

これは、同じ問題に直面している場合は他の誰にでも役立ちます。

0

using (var input = new MemoryStream(bytes)) 
{ 
     // using keyword dispose your stream value before return  
} 

このコードを削除し、この

var input = new MemoryStream(bytes); 
+0

返事をありがとうが、これは残念ながら違いはありませんでした。 – AxleWack

関連する問題