【问题标题】:How to use jquery datatable custom button to export crystal report pdf如何使用jquery datatable自定义按钮导出水晶报表pdf
【发布时间】:2018-08-26 10:19:25
【问题描述】:

如果通过向控制器方法提交表单完成,将 Crystal Reports 导出为 PDF 可以正常工作,但从 jquery 数据表自定义按钮调用该方法时无法正常工作。请浏览我的代码并通过单击 jquery 数据表自定义按钮帮助如何下载 pdf。

控制器方法:

public ActionResult ExportToPDF(string p1, string p2, string p3, string p4)
    {
        List<ViewModels.SomeVM> someVMs = DBTasks.GetSomeVMs(p1, p2, p3, p4);

        ReportDocument rd = new ReportDocument();
        rd.Load(Path.Combine(Server.MapPath("~/Reports"), "Something.rpt"));
        rd.SetDataSource(someVMs);
        //rd.SetParameterValue("@p1", p1);
        //rd.SetParameterValue("@p2", p2);
        //rd.SetParameterValue("@p3", p3);
        //rd.SetParameterValue("@p4", p4);

        Response.Buffer = false;
        Response.ClearContent();
        Response.ClearHeaders();

        Stream stream = rd.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat);
        stream.Seek(0, SeekOrigin.Begin);

        return File(stream, "application/pdf", "Something.pdf");
    }

使用表单提交可以正常工作。

视图中的表单代码:

@using (Html.BeginForm("ExportToPDF", "ControllerName", FormMethod.Get))
{
    @Html.DropDownList("p1", (SelectList)ViewBag.p1List, "Select P1")
    @Html.DropDownList("p2", (SelectList)ViewBag.p2List, "Select P2")
    @Html.DropDownList("p3", (SelectList)ViewBag.p3List, "Select P3")
    @Html.DropDownList("p4", (SelectList)ViewBag.p4List, "Select P4")
    <input type="submit" value="Show" id="showButton" />
}

但我想使用 jquery 自定义按钮来做到这一点。请帮我更正下面的代码。

jQuery 数据表按钮配置:

// Show buttons for Export and Copy
    "buttons": [
        {
            text: 'Export',
            action: function (e, dt, node, config) {
                $.ajax({
                    "url": "/ControllerName/ExportToPDF",
                    "type": "GET",
                    "data": {
                        "p1": $("#p1").val(),
                        "p2": $("#p2").val(),
                        "p3": $("#p3").val(),
                        "p4": $("#p4").val()
                    }
                });
            }
        },
        {
            extend: 'copyHtml5',
            text: 'Copy',
            titleAttr: 'Copy'
        },
]

【问题讨论】:

  • 你得到什么回复,你能在控制台中检查你的 entwork 选项卡,检查响应,我可以猜到它的生成文件,但 ajax 不让它下载
  • 您绝对正确,文件正在生成,但 ajax 无法使其下载。我该怎么做?

标签: javascript jquery datatable crystal-reports


【解决方案1】:

1)创建一个函数,然后在按钮动作中调用该函数,以避免混乱,也可以从其他地方调用

        {
            text: 'Export',
            action: function (e, dt, node, config) {
               downloadpdf();
            }

返回你的 pdf 的 url 然后这样做

function downloadpdf(){
      $.ajax({
          "url": "/ControllerName/ExportToPDF",
          "type": "GET",
          "data": {// your data
           },
          xhrFields: {
            responseType: 'blob'
          },
   beforeSend: function ()
    {
         // loader start
        App.blockUI({animate: true}); 
    },
    error: function () {
        App.unblockUI();

    },
    success: function (objJson) {
            App.unblockUI();
            var a = document.createElement('a');
            var url = window.URL.createObjectURL(data);
            a.href = url;
            a.download = 'myfile.pdf'; //  name you want to give
            a.click();
            window.URL.revokeObjectURL(url);
        }
    });
}

2)还有另一种方法是创建一个表单,然后提交它而不是ajax,我用它来导出csv和excel,

   $('<form>', {
        "id": "mypdf",
        "html": '<input type="hidden" name="ids" value="test" />', // any extra params
        "action": 'ExportToPDF',
        "method":'POST'
    }).appendTo(document.body).submit();

    $('#exportcsvform').remove();

在你的控制器中

public function actionExportcsv() {
        header('content-type: application/pdf');
        header('Content-Disposition: attachment;filename="export.pdf"');

        // code for your pdf

        exit();
    }

iframe 还有另一种方式,您也可以通过创建 iframe 并在 iframe 中打开您的 pdf 链接来使用它

【讨论】:

  • 非常感谢您的详细回答,我应用了您的方法 1。像宝石一样工作!
  • 另外,只要在客户端完成pdf文件生成,你能在这个自定义按钮中显示忙碌/处理动画吗?因为,在我的情况下,从服务器端生成 pdf 最多需要 4-5 秒,所以在单击导出按钮后,用户可能会认为该按钮根本不起作用,尽管实际上正在创建文件。
  • 可以在ajax的beforesend中添加loader start,并成功结束
  • 非常感谢亲爱的 Sunny。你的建议很好。我从 nuget 包管理器在我的项目中添加了 jquery.blockUI 并使用 $.blockUI/$.unblockUI 而不是 App.blockUI/App.unblockUI 来工作而没有任何错误。干杯!
猜你喜欢
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-23
相关资源
最近更新 更多