在MVC应用程序中调用一个ActionResult来导出.xls和.pdf文件

时间:2017-02-19 17:03:31

标签: c# model-view-controller

我希望从视图中的不同按钮(一个用于.xls,一个用于.pdf),在我的控制器中调用一个ActionResult。

我只是想改变参数,但我不知道如何在我的Response.AddHeader中调用它们?! 我有这样的事情:

  string exportType = "Excel";
  string exportExtension = ".xls";

  byte[] bytes = viewer.LocalReport.Render("Excel", null, out mimeType, out encoding, out extension, out streamIds, out warnings);
  Response.Clear();
  Response.ContentType = mimeType;

  Response.AddHeader("content-disposition", "attachment; filename=GeneralOverviewAnnualAwards.xls");

2 个答案:

答案 0 :(得分:1)

所以,在视图中我有这个下拉菜单来选择行动:

            <div class="btn-group col-sm-2">
                <button type="button" data-toggle="dropdown" class="btn btn-danger dropdown-toggle">Export to <span class="caret"></span></button>
                <ul class="dropdown-menu">
                    <li><a href="@Url.Content("~/Controller/ExportExcel?id=" + 1 + "&reportType=" + 1)">Excel</a></li>
                    <li><a href="@Url.Content("~/Controller/ExportExcel?id=" + 1 + "&reportType=" + 2)">Pdf</a></li>
                </ul>
            </div>

在我的控制器中,我用两个参数调用动作:

                    [HttpGet]
public ActionResult ExportExcel(int? id, int? reportType)
{


    List<pr_ReportData_Result> model = Context.pr_ReportData().ToList();


    ReportViewer viewer = new ReportViewer();
    try
    {

        Warning[] warnings;
        string[] streamIds;
        string mimeType = string.Empty, encoding = string.Empty, extension = string.Empty;

        viewer.ProcessingMode = ProcessingMode.Local;
        //viewer.LocalReport.EnableExternalImages = true;

        if (id == 1)
        {
            viewer.LocalReport.ReportPath = Server.MapPath("~/RDLC/Name1.rdlc");
        }
        else if (id == 2)
        {
            viewer.LocalReport.ReportPath = Server.MapPath("~/RDLC/Name2.rdlc");
        }


        string exportType = String.Empty;
        string exportExtension = String.Empty;
        if (reportType == 1)
        {
            exportType = "Excel";
            exportExtension = ".xls";
        }
        else if (reportType == 2)
        {
            exportType = "PDF";
            exportExtension = ".pdf";
        }

        viewer.LocalReport.DataSources.Add(new ReportDataSource("dsReportData", model));

        viewer.LocalReport.EnableHyperlinks = true;
        byte[] bytes = viewer.LocalReport.Render(exportType, null, out mimeType, out encoding, out extension, out streamIds, out warnings);
        Response.Clear();
        Response.ContentType = mimeType;

        if (id == 1)
        {
            Response.AddHeader("content-disposition", "attachment; filename=fileName1" + exportExtension);
        }
        else if (id == 2)
        {
            Response.AddHeader("content-disposition", "attachment; filename=fileName2" + exportExtension);
        }



        Response.BinaryWrite(bytes);
        Response.End();
        return null;

    }
    finally
    {
        if (viewer != null)
        {
            viewer.Dispose();
            viewer = null;
        }
    }

}

通过这种方式,我的控制器中没有重复的代码。

答案 1 :(得分:0)

不确定问题是什么。您想知道如何在视图中的两个不同位置调用一个控制器中的一个方法吗?如果是,这就是答案。

在您的视图中,您需要有两个具有相同操作的form元素。在每种形式中,您需要有一个hidden input元素,其值设置为&#34; xls&#34;或&#34; pdf&#34; (每种形式一个)。另一种方法是使用一个表单和一个操作,但也有switch / checkbox / radiobox定义格式,并在视图模型中传递给控制器​​。但是你提到过你需要两个单独的按钮。

在控制器端,您希望接受具有该隐藏参数的视图模型。通过这种方式,您可以使用参数,例如model.format,并且可以在代码中自由使用它。