2014-10-18 3 views
0

Я делаю вызов AJAX для создания PDF-отчета из кристалла.Как открыть сгенерированный PDF-файл в MVC

Проблема заключается в том, как открыть PDF напрямую.

Ниже приведены мои материалы. Похоже, pdf создан, но он просто возвращается к просмотру и не может открыть PDF.

Прошу вас, руководствоваться.

Код:

 public ActionResult CreatePDF(string paramValue) 
     { 
      DataTable dt = new DataTable(); 
      DataColumn dc = new DataColumn("FieldName"); 
      dt.Columns.Add(dcinitial); 
      DataRow dr = dt.NewRow(); 
      dr[0]=paramValue; 
      dt.Rows.Add(dr); 
      ReportDocument oRpt = new ReportDocument();    
     string path = Server.MapPath("~/PDFDocs/crystalreport.rpt"); 
     oRpt.Load(path); 
     oRpt.SetDataSource(dt); 



     MemoryStream oStream = new MemoryStream(); 
     oStream = (MemoryStream)oRpt.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat); 
     Response.Clear(); 
     Response.Buffer = true; 
     Response.ContentType = "application/pdf"; 
     string fileName = "Report";    
     Response.AppendHeader("content-disposition", "attachment; filename=" + fileName);      
     Response.BinaryWrite(oStream.ToArray()); 
     Response.End(); 
     return View(); 
    } 

Благодаря

ответ

0

Не пишите на Response в контроллере. Помимо проблем со связью и тестируемости, это путает функциональность действия этого контроллера. Этот код пытается и напишите ответ на вопрос и верните представление.

Вместо этого, просто вернуть файл, который вы можете сделать прямо из потока:

return File(oStream, "application/pdf", fileName); 

Однако ...

я AJAX вызов

Это собирается немного усложняют ситуацию. В идеале это не будет быть вызовом AJAX. Это связано с тем, что AJAX не обрабатывает «файлы» так, как вы думаете. There are options, но, вероятно, было бы проще сделать это обычным запросом на уровне страницы, чтобы браузер мог обрабатывать файл изначально.

Поскольку он возвращает файл, а не представление, браузер не выгружает текущую страницу. (Если он не настроен на , отобразите файл, а не сохраните его, хотя вы не можете этого сделать. Однако серверный код правильно указывает на то, что браузер сохранит файл, предоставив заголовок Content-Disposition.)

+0

ОК, все будет хорошо, хотя я назову это действие с помощью AJAX? – dsi

+0

@Dhaval: Я просто добавил несколько подробностей к этому вопросу: короткая версия заключается в том, что вы * можете * обрабатывать загрузку файла через AJAX (вероятно, с использованием плагина где-то), но в идеале это не будет 't быть вызовом AJAX. – David