Justin Woodmancy
Justin Woodmancy

Reputation: 952

Displaying PDF from byte[] in MVC 4

I'm using Grid.MVC to display data from an entity model. On row click I am getting the value of a cell and passing it to my controller with a json/ajax function.

In my controller the int "ticketnumber" is passing just fine. The thing that I am not understanding is when I hard code the int, it is working (if I directly browse to http://localhost:58779/ticket/PDFVIEW).

enter image description here

The controller seems to be running through just fine, but it is not displaying the PDF..it just takes me back to my grid in my view with the ajax script. Thanks for the help.

Edit - Code:

   <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>

controller:

[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");
        }

    }

Upvotes: 0

Views: 2212

Answers (2)

Justin Woodmancy
Justin Woodmancy

Reputation: 952

Using what Richard said helped a lot.

My Json I changed to:

<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>

And in my controller I did:

 [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);
            }

Thank you very much!

Upvotes: 2

Richard
Richard

Reputation: 30628

You can't use AJAX to download a file in this way. Your AJAX code is getting the contents of the PDF, but your browser needs to receive it as a normal request in order to view it. You should instead render a link to the PdfView action, or use window.setLocation if you need to do it from a Javascript event handler.

Note you'll also need to change your action method to accept HttpGet.

Upvotes: 2

Related Questions