如果在浏览器中请求刷新pdf,如何防止额外请求

时间:2016-10-14 19:36:23

标签: asp.net asp.net-mvc google-chrome asp.net-mvc-4 pdf

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控制器:

enter image description here

开发人员工具显示第二个请求已取消。

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&amp;_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>

1 个答案:

答案 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.
}