2017-05-12 30 views
0

レポートを作成し、単純なボタンを使用してダウンロードしようとしています。ボタンはコントローラ上でレポートを作成し、それをファイルとして返し、自動的にダウンロードする必要があります。問題は、アクションがトリガーされているが、ファイルがダウンロードされていないということです。私は私のコードで行方不明です何かわからない:ここではMVCでAJAXを使用してExcelをダウンロードできない

は、Javascriptの一部である:ここで

$(document).ready(function() { 
    fncBindExtractReport(); 
} 

function fncBindExtractReport() { 
     $('button#btnExtractReport').unbind(); 
     $('button#btnExtractReport').on('click', function() { 
       fncExtractReport(); 
     }); 
    } 

function fncExtractReport() { 
      event.preventDefault(); 
      var objData = $('form').serialize(); 
      $.ajax({ 
       url: '@Url.Action("ExtractReport")', 
       type: 'POST', 
       datatype: 'application/JSON', 
       data: objData, 
       beforeSend: function() { 
       }, 
       success: function(result) { 
       }, 
       error: function(request, status, error) { 
       } 
      }); 
     } 

はアクションやコントローラの一部です。私はすでにFileResultとFileContentResultを試しましたが、何も起こりません。コードの終了後、何も起こりません:

[ActionName("ExtractReport")] 
    public ActionResult fncExtractReport(entVwModel objModel) 
    { 
     LocalReport rptReport = new LocalReport(); 
     string strReportType = "EXCEL"; 
     string strMimeType = string.Empty; 
     string strEncoding; 
     string strFileNameExtension = ""; 
     string strDeviceInfo = "<DeviceInfo><SimplePageHeaders>False</SimplePageHeaders></DeviceInfo>"; 
     Warning[] wrnWarnings; 
     string[] strStreams; 
     byte[] renderBytes = null; 
     string strFileName = "Excess 40 Hours Report"; 

     try 
     { 
      rptReport.ReportPath = Server.MapPath("~/ReportTemplates/Report.rdlc"); 
      ReportDataSource rdsBSCList = new ReportDataSource("dsReport", dtData.DefaultView.ToTable()); 
      rptReport.DataSources.Add(rdsBSCList); 
      renderBytes = rptReport.Render(strReportType, strDeviceInfo, out strMimeType, out strEncoding, 
              out strFileNameExtension, out strStreams, out wrnWarnings); 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 

     if (renderBytes != null) 
     { 
      var cd = new System.Net.Mime.ContentDisposition 
       { 
        Inline = false, FileName = "test.xls" 
       }; 

      Response.AppendHeader("Content-Disposition", cd.ToString()); 
     } 
     return File(renderBytes, strMimeType); 
    } 

このレポートでは、働いている、私はすでにそれをデバッグし、すべてのデータテーブルが適切に生成されます。私はなぜ私のボタンをクリックしたときにダウンロードが起こっているのか分かりません。開発者用コンソールのコンソールにもエラーはありませんでした。

+0

? –

+0

申し訳ありませんが、コードを修正しました。 $( 'button#btnExtractReport')をクリックすると定義されます。on( 'click'、function(){ fncExtractReport(); }); –

+0

簡単な答えは、あなたはajaxで投稿を行い、ブラウザがファイルを開くことを期待できないということです。ブラウザー全体を 'ExtractReport'アクションURLに向ける必要があります。 – Niklas

答えて

0

ajaxを使用してコントローラからファイルを取得することはできません。フォームをsubmitingによってポストバック呼び出しを実行する必要があります。

function fncExtractReport() { 
      event.preventDefault(); 
      $('form').submit(); 
     } 

として、フォームのアクションを設定: `event`は、あなたの` `fncExtractReport関数内で定義されています

'@Url.Action("ExtractReport")' 
+0

Url.Actionコードを設定する場所は? –

+0

関連する問題