2017-02-08 35 views
0

我是C#的新手,我想使用HttpResponseMessage在Web标签上显示一个新的动态创建的PDF到Web浏览器客户端。ajax调用MVC后在新标签页上显示PDF C#

创建的PDF文件是有效的。 这是我的控制器代码:

[HttpGet] 
    public HttpResponseMessage ShowPDF() 
    { 

     MemoryStream ms = new GetPDF(); 
     Byte[] bytes = ms.GetBuffer(); 

     HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK); 
     Response.AppendHeader("Content-Disposition", "inline; filename=test.pdf"); 

     result.Content = new StreamContent(ms); 
     result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf"); 

     return result; 
    } 

点击按钮HTML页面后,什么也没发生,没有错误,但也显示没有新的PDF。我尝试使用MemoryStream或缓冲区,但似乎没有任何工作。

编辑

这里是我的视图代码:

 <button id="GetPDF" class="btn btn-primary pull-right">GET PDF</button> 

的Javascript:

$('#GetPDF').click(function (e) { 
     e.preventDefault(); 
     $.ajax({ 
      url: '@Url.Action("ShowPDF", "Controller")', 
      method: 'GET', 
      success: function (data, textStatus, jqXHR) { 
      //Showing something but what 
      }, 
      error: function (jqXHR, textStatus, errorThrown) { 
      //Showing error message 
      } 
     }); 
    }); 
+0

什么按钮?你没有显示任何按钮。你有没有尝试过调试代码?确保你的操作方法已经达到,等等? – mason

+0

我编辑了我的帖子,并且是我的操作方法正在被调用。 – rvsntn

+0

没有任何事情发生,至少部分是因为你对ajax调用的结果没有做任何事情。除非你在示例中遗漏了“成功”回调的内容?你的动作方法被调用是很好的,所以你检查了响应中是否有返回的内容? – ADyson

回答

0

好吧,我设法使它工作。这里是我的解决方案,我将优化它的明天...

的Javascript:

 $('#GetPDF').click(function (e) { 
     window.open('@Url.Action("ShowPDF", "Controller")'); 
    }); 

控制器的方法:

[HttpGet] 
    public ActionResult ShowPDF() 
    { 
     try 
     { 
      MemoryStream ms = new MemoryStream(GetPDF().ToArray()); 
      FileStreamResult filestream = new FileStreamResult(ms, "application/pdf"); 
      return filestream; 
     } 
     catch (Exception ex) 
     { 
      throw new Exception(); 
     } 
    } 

GetPDF返回一个MemoryStream,但收盘。您必须使用ToArray()获取Byte []元素,然后使用构造函数创建另一个MemoryStream。

非常感谢Adyson和梅森的帮助。

相关问题