Самое важное, что 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 в браузере с именем?