ASP.NET MVC 4控制器转发pdf:
public class ReportController : ControllerBase
{
public ActionResult Pdf() {
byte[] result = CreatePDF();
var ms = new MemoryStream(result);
return new FileStreamResult(ms, "application/pdf");
}
}
结果显示在Chrome浏览器窗口中。 如果在浏览器中调用此网址或按下刷新按钮,则Chrome会两次调用Pdf控制器:
开发人员工具显示第二个请求已取消。
Pdf创建在控制器中花费了大量时间。 如何强制浏览器只发送单个请求? 或者如何在控制器中删除假请求而不生成pdf?
更新
页面定义为
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link href="/css/redmond/jquery-ui.css" rel="stylesheet" />
<link href="/Content/font-awesome.min.css" rel="stylesheet" />
<link href="/Content/bootstrap.css" rel="stylesheet" />
<link href="/Content/bootstrap-theme.css" rel="stylesheet" />
<link href="/Scripts/jqgrid-4.9.1/css/ui.jqgrid.css" rel="stylesheet" />
<link href="/Content/Css/Site.css" rel="stylesheet" />
<script src="/Scripts/jquery-1.12.4.js"></script>
<script src="/Scripts/jquery-ui-1.11.4.js"></script>
<script src="/Scripts/i18n/jquery.ui.datepicker-et.js"></script>
<script src="/Scripts/bootstrap.js"></script>
<script src="/Scripts/jqgrid-4.9.1/js/i18n/grid.locale-et.js"></script>
<script src="/Scripts/jqgrid-4.9.1/js/jquery.jqgrid.src.js"></script>
<script src="/Scripts/jqgrid-4.9.1/plugins/jquery.jqgrid.showhidecolumnmenu.js"></script>
<script src="/Scripts/jqgrid-4.9.1/plugins/jquery.contextmenu-ui.js"></script>
<script src="/Scripts/jqgrid-4.9.1/plugins/jquery.createcontexmenufromnavigatorbuttons.js"></script>
<script src="/Scripts/json2.js"></script>
<script src="/Scripts/jquery.form.js"></script>
<script src="/Scripts/myerp.js"></script>
<script src="/Scripts/TinyMCE/tiny_mce.js"></script>
<script src="/Scripts/TinyMCE/jquery.tinymce.js"></script>
...
</head>
<body>
...
<div class="container-fluid">
<form id="_form" target="_blank" class='form-inline'>
<div class="panel panel-warning">
<div id='contentCaptionDiv' class="panel-heading">
<input type="submit" id='_submit' class="btn btn-primary"
formaction='/Report/Html'
formtarget="_blank"
value='Show html' />
<input type="submit"
formaction='/Report/Pdf'
class="btn btn-info"
formtarget="_blank"
value='PDF' />
<input type="submit"
formaction='/Report/Xls'
class="btn btn-warning"
formtarget="_blank"
value='CSV' />
<input type="submit"
formaction='/Report/Designer?_entity=DokGReport&_dokumnrs=130637'
formtarget="_blank"
class="btn btn--inverse"
value='Change' />
...
<script>
$(function () {
var lastFocus = [];
var elements = getFocusableElements();
elements.focus(function () {
lastFocus = $(this);
});
$('#_form').keypress(function (e) {
if (enter(e)) {
$('#_submit').click();
return false;
}
});
$('#sendemail').click(function (e) {
$('#_form').attr('action', $(this).attr('formaction'))
.attr('target', $(this).attr('formtarget'));
});
elements.eq(0).focus().select();
$('#_Report').dblclick(function () {
$('#_submit').click();
});
$('#_form').on('click', 'input[type=submit]', function (e) {
var attr = this.getAttribute('formAction');
if (attr) {
this.form.action = attr;
}
});
});
</script>
</div>
</div>
</form>
</div>
</body>
</html>
答案 0 :(得分:0)
你不能也不应该试着这样做。用户可以根据自己喜欢的时间点击刷新按钮。您应该检查文件是否已在操作方法中创建并返回结果。
public ActionResult Pdf() {
byte[] result = GetExistingOrCreatePDF();
var ms = new MemoryStream(result);
return new FileStreamResult(ms, "application/pdf");
}
public byte[] GetExistingOrCreatePDF()
{
//Check whether the PDF is already generated and exist in a DISK location.
// If yes, read it and return the byte array
// else , create , store and return.
}