C# ajax调用MVC后在新选项卡上显示PDF#
我是C#的新手,我想使用HttpResponseMessage在新选项卡上向web浏览器客户端显示新创建的动态PDF 创建的PDF是有效的。 这是我的控制器代码:C# ajax调用MVC后在新选项卡上显示PDF#,c#,ajax,asp.net-mvc,pdf,C#,Ajax,Asp.net Mvc,Pdf,我是C#的新手,我想使用HttpResponseMessage在新选项卡上向web浏览器客户端显示新创建的动态PDF 创建的PDF是有效的。 这是我的控制器代码: [HttpGet] public HttpResponseMessage ShowPDF() { MemoryStream ms = new GetPDF(); Byte[] bytes = ms.GetBuffer(); HttpResponseMessag
[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或Buffer,但似乎都不起作用
编辑
以下是我的查看代码:
<button id="GetPDF" class="btn btn-primary pull-right">GET PDF</button>
好吧,我成功了。这是我的解决方案,我明天会优化它 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
非常感谢阿德森和梅森的帮助。什么按钮?您没有显示任何按钮。你试过调试代码吗?确保到达您的操作方法,等等?我已经编辑了我的帖子,是的,正在调用我的操作方法。没有发生任何事情,至少部分是因为您没有对ajax调用的结果做任何事情。除非您在示例中遗漏了“success”回调的内容?调用您的action方法很好,所以您是否检查了响应中是否确实返回了内容?是的,返回了内容(在ajax函数中的数据中)。它也成功了。我不知道是不是我的方法不起作用,也不知道在ajax成功函数中放入什么来显示数据/PDF(它肯定有内容类型:application/PDF)。这是一个棘手的问题。在您的情况下,您希望将其放在新窗口/选项卡中。因为这里没有URL,只有一些二进制数据,这很棘手。最好放弃ajax,只做一些类似于
window.open('@Url.Action(“ShowPDF”,“Controller”))代码>。别忘了,浏览器不能以本机方式打开PDF文件——这是一个插件功能。Chrome默认包含一个插件,Firefox可能会,但IE和移动浏览器通常不会。因此,如果没有插件,你无论如何也不能在浏览器中“显示”你的PDF,用户只会得到一个下载提示。
[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();
}
}