在MVC 4中从byte []显示PDF

时间:2016-01-19 19:24:10

标签: c# ajax asp.net-mvc pdf

我使用Grid.MVC来显示实体模型中的数据。在行上单击我获取单元格的值并使用json / ajax函数将其传递给我的控制器。

在我的控制器中,int" ticketnumber"过得很好。我不理解的是当我对int进行硬编码时,它正在工作(如果我直接浏览到http://localhost:58779/ticket/PDFVIEW)。

enter image description here

控制器似乎运行得很好,但它没有显示PDF ..只是在我的视图中使用ajax脚本将我带回我的网格。谢谢你的帮助。

编辑 - 代码:

   <script>
        $(function () {
            pageGrids.TicketGrid.onRowSelect(function (e) {
                var ticketnumber = e.row.UnsettledID;
                ticketnumber = JSON.stringify({ 'ticketnumber': ticketnumber });
                $.ajax({
                    contentType: 'application/json; charset=utf-8',
                    dataType: 'json',
                    type: 'POST',
                    url: '/ticket/PDFVIEW',
                    data: ticketnumber,

                });
            });
        });

    </script>

控制器:

[ActionName("PDFVIEW")]
    [HttpGet]
    public ActionResult PDFVIEW(int ticketnumber)
    {

        var db = new ScaleTrac_VerticalEntities();
        Ticket_UnsettledScaleImages tu = new Ticket_UnsettledScaleImages();
        tu = db.Ticket_UnsettledScaleImages.Where(p => p.UnsettledID == ticketnumber).First();
        string filename = "ScaleTick" + tu.UnsettledID + ".pdf";
        {
            byte[] bytes = tu.ScaleTicket;
            TempData["bytes"] = bytes;
            Response.Clear();
            MemoryStream ms = new MemoryStream(bytes);

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

    }

2 个答案:

答案 0 :(得分:1)

您无法使用AJAX以这种方式下载文件。您的AJAX代码正在获取PDF的内容,但您的浏览器需要将其作为正常请求接收才能查看。您应该改为呈现PdfView操作的链接,或者如果需要从Javascript事件处理程序执行此操作,请使用window.setLocation

请注意,您还需要更改操作方法以接受HttpGet。

答案 1 :(得分:1)

使用理查德所说的帮助很多。

我的Json我改为:

<script>
    $(function pdfviewer() {
        pageGrids.TicketGrid.onRowSelect(function (e) {
            var ticketnumber = e.row.UnsettledID;
            ticketnumber = JSON.stringify({ 'ticketnumber': ticketnumber });
            $.ajax({
                contentType: 'application/json; charset=utf-8',
                dataType: 'json',
                type: 'POST',
                url: '/ticket/PDFVIEW',
                data: ticketnumber,
                success: function (d) {
                    if (d.success) {
                        window.location = "/Ticket/DownloadFile" + "?fName=" + d.fName;
                    }
                },
                error: function () {
                    alert("Error");
                }
            });
        });
     });     
</script>

在我的控制器中我做了:

 [ActionName("PDFVIEW")]
    public ActionResult pdf(int ticketnumber)
    {

        var db = new ScaleTrac_VerticalEntities();
        Ticket_UnsettledScaleImages tu = new Ticket_UnsettledScaleImages();
        tu = db.Ticket_UnsettledScaleImages.Where(p => p.UnsettledID == ticketnumber).First();
        string filename = "ScaleTick" + tu.UnsettledID + ".pdf";
        {
            byte[] bytes = tu.ScaleTicket;
            TempData["bytes"] = bytes;
            Response.Clear();
            MemoryStream ms = new MemoryStream(bytes);
            var fName = string.Format("File-{0}.pdf", DateTime.Now.ToString("s"));
            Session[fName] = ms;
            return Json(new { success = true, fName }, JsonRequestBehavior.AllowGet);
        }
    }

        public ActionResult DownloadFile(string fName)
            {
             var ms = Session[fName] as MemoryStream;
                 if (ms == null)
                 return new EmptyResult();
                 Session[fName] = null;
                 return File(ms, "application/pdf", fName);
            }

非常感谢!