Как открыть PDF-файл в новой вкладке или окне вместо его загрузки с помощью C # и ASP.NET MVC? - PullRequest
0 голосов
/ 05 марта 2019

У меня есть экран счета-фактуры, и на этом экране доступно количество доступных заказов, поэтому, когда мы создаем счет-фактуру, нам нужно заполнить одну форму, поэтому я хочу решить, когда я отправляю эту форму счета-фактуры или нажимаю эту кнопку отправки, pdf должен бытьоткрыть в новой вкладке.Я хочу уточнить, что мы нигде не сохраняем этот PDF-файл.

<div class="modal-footer custom-no-top-border">
      <input type="submit" class="btn btn-primary" id="createdata" value="@T("Admin.Common.Create")" />
</div>

Когда я нажимаю на эту кнопку, PDF-файл должен быть открыт в новой вкладке.

Вот код PDF

 [HttpPost]
 public virtual ActionResult PdfInvoice(int customerOrderselectedId)
 {
        var customerOrder = _customerOrderService.GetCustomerOrderById(customerOrderselectedId);

        var customerOrders = new List<DD_CustomerOrder>();

        customerOrders.Add(customerOrder);
        byte[] bytes;

        using (var stream = new MemoryStream())
        {
            _customerOrderPdfService.PrintInvoicePdf(stream, customerOrders);
            bytes = stream.ToArray();
        }

        return File(bytes, MimeTypes.ApplicationPdf, string.Format("order_{0}.pdf", customerOrder.Id));
    }

Этот код загружает PDF, когда я нажимаю на кнопку.

Спасибо !!

1 Ответ

0 голосов
/ 05 марта 2019

Самое важное, что Controller.File() работает с [HttpGet], поэтому вы должны выполнить следующие шаги:

1) Измените тип метода HTTP с [HttpPost] на [HttpGet] и установите return File() безуказание параметра fileDownloadName (с использованием перегрузки Controller.File(), которая принимает 2 параметра).

[HttpGet]
public virtual ActionResult PdfInvoice(int customerOrderselectedId)
{
    var customerOrder = _customerOrderService.GetCustomerOrderById(customerOrderselectedId);

    var customerOrders = new List<DD_CustomerOrder>();

    customerOrders.Add(customerOrder);
    byte[] bytes;
    using (var stream = new MemoryStream())
    {
        _customerOrderPdfService.PrintInvoicePdf(stream, customerOrders);
        bytes = stream.ToArray();
    }

    // use 2 parameters
    return File(bytes, MimeTypes.ApplicationPdf);
}

2) Обрабатывать click событие этой кнопки (предпочтительно с использованием <input type="button" .../>)и используйте параметр _blank, или используйте тег привязки (<a>) с атрибутом target='_blank':

$('#createdata').click(function (e) {
    // if using type="submit", this is mandatory
    e.preventDefault();

    window.open('@Url.Action("PdfInvoice", "ControllerName", new { customerOrderselectedId = selectedId })', '_blank');
});

Причина, по которой параметр fileDownloadName здесь не используется, заключается в том, что наборы параметров Content-Disposition: attachmentесли указано имя файла, в противном случае, если вы опустите его или используете значение null, то Content-Disposition: inline будет установлено автоматически.

Обратите внимание, что, поскольку вы используете FileResult, вам не следует устанавливатьContent-Disposition, используя Response.AddHeader до return File(), как это, потому что при этом будет отправлено несколько Content-Disposition заголовков, в результате чего браузер не отображает файл:

// this is wrong way, should not be used
Response.AddHeader("Content-Disposition", "inline; filename=order_XXX.pdf");
return File(bytes, MimeTypes.ApplicationPdf);

Связанные проблемы:

Как открыть файл PDF в новой вкладке в MVC с помощью C #

ASP.NET MVC: Как заставить браузер открывать и отображать PDF вместо отображения запроса на загрузку?

Потоковый файл с использованием ASP.NET MVC FileContentResult в браузере с именем?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...