【问题标题】:How can I use a reportviewer control in an asp.net mvc 3 razor view?如何在 asp.net mvc 3 razor 视图中使用 reportviewer 控件?
【发布时间】:2011-09-02 22:10:24
【问题描述】:

我正在尝试在 mvc 3 框架中的 razor 视图中使用 reportviewer 控件。 online documentation 谈到拖放。关于如何将其插入视图的任何建议。

【问题讨论】:

    标签: asp.net-mvc-3 razor reportviewer


    【解决方案1】:

    可以在不使用 iFrame 或 aspx 页面的情况下让 SSRS 报告显示在 MVC 页面上。

    这里解释了大部分工作:

    http://geekswithblogs.net/stun/archive/2010/02/26/executing-reporting-services-web-service-from-asp-net-mvc-using-wcf-add-service-reference.aspx

    该链接说明了如何创建 Web 服务和 MVC 操作方法,以允许您调用报告服务并将 Web 服务的结果呈现为 Excel 文件。对示例中的代码稍作改动,您就可以将其呈现为 HTML。

    然后您需要做的就是使用一个按钮调用一个 javascript 函数,该函数对您的 MVC 操作进行 AJAX 调用,该操作返回报告的 HTML。当 AJAX 调用返回 HTML 时,只需用这个 HTML 替换一个 div。

    我们使用 AngularJS,所以我下面的例子就是这种格式,但它可以是任何 javascript 函数

    $scope.getReport = function()
    {
        $http({
            method: "POST",
            url: "Report/ExportReport",
            data: 
                    [
                        { Name: 'DateFrom', Value: $scope.dateFrom },
                        { Name: 'DateTo', Value: $scope.dateTo },
                        { Name: 'LocationsCSV', Value: $scope.locationCSV }
                    ]
    
        })
        .success(function (serverData)
        {
            $("#ReportDiv").html(serverData);
        });
    
    };
    

    还有Action Method——主要取自上面的链接...

        [System.Web.Mvc.HttpPost]
        public FileContentResult ExportReport([FromBody]List<ReportParameterModel> parameters)
        {
             byte[] output;
             string extension, mimeType, encoding;
             string reportName = "/Reports/DummyReport";
             ReportService.Warning[] warnings;
             string[] ids;
    
         ReportExporter.Export(
                "ReportExecutionServiceSoap" 
                new NetworkCredential("username", "password", "domain"),
                reportName,
                parameters.ToArray(),
                ExportFormat.HTML4,
                out output,
                out extension,
                out mimeType,
                out encoding,
                out warnings,
                out ids
            );
    
            //-------------------------------------------------------------
            // Set HTTP Response Header to show download dialog popup
            //-------------------------------------------------------------
            Response.AddHeader("content-disposition", string.Format("attachment;filename=GeneratedExcelFile{0:yyyyMMdd}.{1}", DateTime.Today, extension));
            return new FileContentResult(output, mimeType);
        }
    

    因此,您可以将参数传递给 SSRS 报告服务器,该服务器会返回您呈现为 HTML 的报告。一切都出现在一页上。这是我能找到的最佳解决方案

    【讨论】:

      【解决方案2】:

      NuGet 中有一个 MvcReportViewer 助手。

      http://www.nuget.org/packages/MvcReportViewer/

      这是细节:

      https://github.com/ilich/MvcReportViewer

      我用过这个。效果很好。

      【讨论】:

      • 感谢发帖,这个项目真是太棒了。刚刚集成到我的应用程序中,快速简单。完美运行。
      【解决方案3】:

      这是一个简单的任务。您可以按照以下步骤操作。

      1. 在您的解决方案中创建一个文件夹并将其命名为 Reports
      2. 添加一个 ASP.Net Web 表单并将其命名为 ReportView.aspx
      3. 创建一个类 ReportData 并将其添加到 Reports 文件夹中。将以下代码添加到类中。

        public class ReportData  
        {  
            public ReportData()  
            {  
                this.ReportParameters = new List<Parameter>();  
                this.DataParameters = new List<Parameter>();  
            }
        
            public bool IsLocal { get; set; }
            public string ReportName { get; set; }
            public List<Parameter> ReportParameters { get; set; }
            public List<Parameter> DataParameters { get; set; }
        }
        
        public class Parameter  
        {  
            public string ParameterName { get; set; }  
            public string Value { get; set; }  
        }
        
      4. 添加另一个类并将其命名为 ReportBasePage.cs。在这个类中添加以下代码。

        public class ReportBasePage : System.Web.UI.Page
        {
            protected ReportData ReportDataObj { get; set; }
        
            protected override void OnInit(EventArgs e)
            {
                base.OnInit(e);
                if (HttpContext.Current != null)
                    if (HttpContext.Current.Session["ReportData"] != null)
                    {
                        ReportDataObj = HttpContext.Current.Session["ReportData"] as ReportData;
                        return;
                    }
                ReportDataObj = new ReportData();
                CaptureRouteData(Page.Request);
            }
        
        
            private void CaptureRouteData(HttpRequest request)
            {
                var mode = (request.QueryString["rptmode"] + "").Trim();
                ReportDataObj.IsLocal = mode == "local" ? true : false;
                ReportDataObj.ReportName = request.QueryString["reportname"] + "";
                string dquerystr = request.QueryString["parameters"] + "";
                if (!String.IsNullOrEmpty(dquerystr.Trim()))
                {
                    var param1 = dquerystr.Split(',');
                    foreach (string pm in param1)
                    {
                        var rp = new Parameter();
                        var kd = pm.Split('=');
                        if (kd[0].Substring(0, 2) == "rp")
                        {
                            rp.ParameterName = kd[0].Replace("rp", "");
                            if (kd.Length > 1) rp.Value = kd[1];
                            ReportDataObj.ReportParameters.Add(rp);
                        }
                        else if (kd[0].Substring(0, 2) == "dp")
                        {
                            rp.ParameterName = kd[0].Replace("dp", "");
                            if (kd.Length > 1) rp.Value = kd[1];
                            ReportDataObj.DataParameters.Add(rp);
                        }
                    }
                }
            }
        }
        
      5. ScriptManager 添加到 ReportView.aspx 页面。现在向页面添加一个报告查看器。在报表查看器中设置属性 AsyncRendering="false"。代码如下。

            <rsweb:ReportViewer ID="ReportViewerRSFReports" runat="server" AsyncRendering="false"
                Width="1271px" Height="1000px" >
            </rsweb:ReportViewer>
        
      6. ReportView.aspx.cs

        中添加两个NameSpace
        using Microsoft.Reporting.WebForms;
        using System.IO;
        
      7. System.Web.UI.Page 更改为 ReportBasePage。只需使用以下代码替换您的代码。

        public partial class ReportView : ReportBasePage
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    RenderReportModels(this.ReportDataObj);
                }
            }
        
            private void RenderReportModels(ReportData reportData)
            {
                // This is the Data Access Layer from which a method is called to fill data to the list.
                RASolarERPData dal = new RASolarERPData();
                List<ClosingInventoryValuation> objClosingInventory = new List<ClosingInventoryValuation>();
        
                // Reset report properties.
                ReportViewerRSFReports.Height = Unit.Parse("100%");
                ReportViewerRSFReports.Width = Unit.Parse("100%");
                ReportViewerRSFReports.CssClass = "table";
        
                // Clear out any previous datasources.
                this.ReportViewerRSFReports.LocalReport.DataSources.Clear();
        
                // Set report mode for local processing.
                ReportViewerRSFReports.ProcessingMode = ProcessingMode.Local;
        
                // Validate report source.
                var rptPath = Server.MapPath(@"./Report/" + reportData.ReportName +".rdlc");
        
                //@"E:\RSFERP_SourceCode\RASolarERP\RASolarERP\Reports\Report\" + reportData.ReportName + ".rdlc";
                //Server.MapPath(@"./Report/ClosingInventory.rdlc");
        
                if (!File.Exists(rptPath))
                    return;
        
                // Set report path.
                this.ReportViewerRSFReports.LocalReport.ReportPath = rptPath;
        
                // Set report parameters.
                var rpPms = ReportViewerRSFReports.LocalReport.GetParameters();
                foreach (var rpm in rpPms)
                {
                    var p = reportData.ReportParameters.SingleOrDefault(o => o.ParameterName.ToLower() == rpm.Name.ToLower());
                    if (p != null)
                    {
                        ReportParameter rp = new ReportParameter(rpm.Name, p.Value);
                        ReportViewerRSFReports.LocalReport.SetParameters(rp);
                    }
                }
        
                //Set data paramater for report SP execution
                objClosingInventory = dal.ClosingInventoryReport(this.ReportDataObj.DataParameters[0].Value);
        
                // Load the dataSource.
                var dsmems = ReportViewerRSFReports.LocalReport.GetDataSourceNames();
                ReportViewerRSFReports.LocalReport.DataSources.Add(new ReportDataSource(dsmems[0], objClosingInventory));
        
                // Refresh the ReportViewer.
                ReportViewerRSFReports.LocalReport.Refresh();
            }
        }
        
      8. 将文件夹添加到 Reports 文件夹并将其命名为 Report。现在将 RDLC 报告添加到 Reports/Report 文件夹并将其命名为 ClosingInventory。 rdlc

      9. 现在添加一个控制器并将其命名为 ReportController。在控制器中添加以下操作方法。

        public ActionResult ReportViewer()
            {                
                ViewData["reportUrl"] = "../Reports/View/local/ClosingInventory/";
        
                return View();
            }
        
      10. ReportViewer 控制器上添加视图页面。将视图页面命名为 ReportViewer.cshtml。将以下代码添加到视图页面。

        @using (Html.BeginForm("Login"))
         { 
               @Html.DropDownList("ddlYearMonthFormat", new SelectList(ViewBag.YearMonthFormat, "YearMonthValue",
         "YearMonthName"), new { @class = "DropDown" })
        
        Stock In Transit: @Html.TextBox("txtStockInTransit", "", new { @class = "LogInTextBox" })
        
        <input type="submit" onclick="return ReportValidationCheck();" name="ShowReport"
                         value="Show Report" />
        
        }
        
      11. 添加 Iframe。设置iframe的属性如下

        frameborder="0"  width="1000"; height="1000"; style="overflow:hidden;"
        scrolling="no"
        
      12. 将以下 JavaScript 添加到查看器。

        function ReportValidationCheck() {
        
            var url = $('#hdUrl').val();
            var yearmonth = $('#ddlYearMonthFormat').val();      
            var stockInTransit = $('#txtStockInTransit').val()
        
            if (stockInTransit == "") {
                stockInTransit = 0;
            }
        
            if (yearmonth == "0") {
                alert("Please Select Month Correctly.");
            }
            else {
        
                //url = url + "dpSpYearMonth=" + yearmonth + ",rpYearMonth=" + yearmonth + ",rpStockInTransit=" + stockInTransit;
        
                url = "../Reports/ReportView.aspx?rptmode=local&reportname=ClosingInventory&parameters=dpSpYearMonth=" + yearmonth + ",rpYearMonth=" + yearmonth + ",rpStockInTransit=" + stockInTransit;
        
                var myframe = document.getElementById("ifrmReportViewer");
                if (myframe !== null) {
                    if (myframe.src) {
                        myframe.src = url;
                    }
                    else if (myframe.contentWindow !== null && myframe.contentWindow.location !== null) {
                        myframe.contentWindow.location = url;
                    }
                    else { myframe.setAttribute('src', url); }
                }
            }
        
            return false;
        }
        
      13. Web.config 文件将以下键添加到 appSettings 部分

        add key="UnobtrusiveJavaScriptEnabled" value="true"
        
      14. system.web handlers 部分添加以下键

        add verb="*" path="Reserved.ReportViewerWebControl.axd" type = "Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
        
      15. 将您的数据源更改为您自己的。这个解决方案非常简单,我想每个人都会喜欢它。

      【讨论】:

      • 大声笑,简单的任务和 400 行答案
      • 还有两个神秘的变量从没人知道的库中声明,RASolarERPData dalList&lt;ClosingInventoryValuation&gt; objClosingInventory
      • Dal 是数据访问层,从中调用一个方法将数据填充到列表中。 objClosingInventory = dal.ClosingInventoryReport(this.ReportDataObj.DataParameters[0].Value);
      【解决方案4】:

      这是在 MVC .aspx 视图中直接集成报表查看器控件(以及任何 asp.net 服务器端控件)的完整解决方案,它也适用于具有多个页面的报表(与 Adrian Toman 的回答不同) 并且 AsyncRendering 设置为 true,(基于 Steve Sanderson 的“Pro ASP.NET MVC Framework”)。

      基本上需要做的是:

      1. 添加一个带有 runat = "server" 的表单

      2. 添加控件,(对于报表查看器控件,它有时甚至可以使用 AsyncRendering="True" 但并非总是如此,因此请检查您的具体情况)

      3. 使用带有 runat = "server" 的脚本标签添加服务器端脚本

      4. 使用下面显示的代码覆盖 Page_Init 事件,以启用 PostBack 和 Viewstate

      这是一个演示:

      <form ID="form1" runat="server">
          <rsweb:ReportViewer ID="ReportViewer1" runat="server" />
      </form>
      <script runat="server">
          protected void Page_Init(object sender, EventArgs e)
          {
              Context.Handler = Page;
          }
          //Other code needed for the report viewer here        
      </script>
      

      当然建议充分利用 MVC 方法,通过在控制器中准备所有需要的数据,然后通过 ViewModel 将其传递给视图。

      这将允许重用视图!

      但是,这仅适用于每次回发所需的数据,或者即使它们仅用于初始化,如果它不是数据密集型的,并且数据也不必依赖于 PostBack 和 ViewState 值。

      但是,有时甚至可以将数据密集型封装到 lambda 表达式中,然后传递给要在那里调用的视图。

      不过有几点注意事项:

      • 通过这样做,视图本质上变成了一个具有所有缺点的 Web 表单(即回发,以及非 Asp.NET 控件被覆盖的可能性)
      • 覆盖 Page_Init 的 hack 未记录在案,随时可能更改

      【讨论】:

      • 我无法让它工作。该报告仍然没有在回发时更新
      • @ministrymason 尝试将 AsyncRendering 设置为 false,我也只在 MVC 3 上对其进行了测试,当然请注意它仅适用于 .aspx 视图而不是 razor 视图
      • 与@ministrymason 相同的问题。我用@Html.Partial 调用它,它可以正常加载,但是所有控件都不起作用,例如页面导航或展开和折叠表格行。
      • @Bjelovuk 我无法访问您的代码,即使如此我也不会说故障排除会很容易,但我可以提供一些建议,1)主视图是剃刀视图还是 aspx ? 2)当它不是部分时它是否有效? 3) 回发代码是否在客户端发出?尝试导航时,HTTP 级别的幕后发生了什么? 4)视图的基类是什么,渲染时Handler和Page的值是什么?
      【解决方案5】:

      我正在使用带有 SSRS 2008 的 ASP.NET MVC3,当我尝试从远程服务器获取报告时,我无法让 @Adrian's 为我工作 100%。

      最后发现需要把ViewUserControl1.ascx中的Page_Load方法改成如下:

      ReportViewer1.ProcessingMode = ProcessingMode.Remote;
      ServerReport serverReport = ReportViewer1.ServerReport;
      serverReport.ReportServerUrl = new Uri("http://<Server Name>/reportserver");
      serverReport.ReportPath = "/My Folder/MyReport";
      serverReport.Refresh();
      

      我错过了 ProcessingMode.Remote

      参考资料:

      http://msdn.microsoft.com/en-us/library/aa337091.aspx - 报告查看器

      【讨论】:

      • 非常感谢!我一直在努力让它工作几个小时!你真的拯救了我的一天!再次感谢您!
      【解决方案6】:

      以下解决方案仅适用于单页报告。有关详细信息,请参阅 cmets。

      ReportViewer 是一个服务器控件,因此不能在剃刀视图中使用。但是,您可以将包含 ReportViewer 的 ASPX 视图页面、视图用户控件或传统 Web 表单添加到应用程序中。

      您需要确保已添加relevant handler into your web.config

      如果您使用 ASPX 视图页面或视图用户控件,您将需要设置 AsyncRendering 为 false 以使报告正确显示。

      更新:

      添加了更多示例代码。请注意,Global.asax 中不需要进行有意义的更改。

      Web.Config

      我的结果如下:

      <?xml version="1.0"?>
      <!--
        For more information on how to configure your ASP.NET application, please visit
        http://go.microsoft.com/fwlink/?LinkId=152368
        -->
      
      <configuration>
        <appSettings>
          <add key="webpages:Version" value="1.0.0.0"/>
          <add key="ClientValidationEnabled" value="true"/>
          <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
        </appSettings>
      
        <system.web>
          <compilation debug="true" targetFramework="4.0">
            <assemblies>
              <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
              <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
              <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
              <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
              <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
              <add assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
              <add assembly="Microsoft.ReportViewer.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
            </assemblies>
          </compilation>
      
          <authentication mode="Forms">
            <forms loginUrl="~/Account/LogOn" timeout="2880" />
          </authentication>
      
          <pages>
            <namespaces>
              <add namespace="System.Web.Helpers" />
              <add namespace="System.Web.Mvc" />
              <add namespace="System.Web.Mvc.Ajax" />
              <add namespace="System.Web.Mvc.Html" />
              <add namespace="System.Web.Routing" />
              <add namespace="System.Web.WebPages"/>
            </namespaces>
          </pages>
        </system.web>
      
        <system.webServer>
          <validation validateIntegratedModeConfiguration="false"/>
          <modules runAllManagedModulesForAllRequests="true"/>
          <handlers>
            <add name="ReportViewerWebControlHandler" preCondition="integratedMode" verb="*" path="Reserved.ReportViewerWebControl.axd" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
          </handlers>
        </system.webServer>
      
        <runtime>
          <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
              <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
              <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
            </dependentAssembly>
          </assemblyBinding>
        </runtime>
      </configuration>
      

      控制器

      控制器动作非常简单。

      作为奖励,File() 操作将“TestReport.rdlc”的输出作为 PDF 文件返回。

      using System.Web.Mvc;
      using Microsoft.Reporting.WebForms;
      
      ...
      
      public class PDFController : Controller
      {
          public ActionResult Index()
          {
              return View();
          }
      
          public FileResult File()
          {
              ReportViewer rv = new Microsoft.Reporting.WebForms.ReportViewer();
              rv.ProcessingMode = ProcessingMode.Local;
              rv.LocalReport.ReportPath = Server.MapPath("~/Reports/TestReport.rdlc");
              rv.LocalReport.Refresh();
      
              byte[] streamBytes = null;
              string mimeType = "";
              string encoding = "";
              string filenameExtension = "";
              string[] streamids = null;
              Warning[] warnings = null;
      
              streamBytes = rv.LocalReport.Render("PDF", null, out mimeType, out encoding, out filenameExtension, out streamids, out warnings);
      
              return File(streamBytes, mimeType, "TestReport.pdf");
          }
      
          public ActionResult ASPXView()
          {
              return View();
          }
      
          public ActionResult ASPXUserControl()
          {
              return View();
          }
      }
      

      ASPXView.apsx

      ASPXView如下。

      <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
      <%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
          Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>
      
      <!DOCTYPE html>
      
      <html>
      <head runat="server">
          <title>ASPXView</title>
      </head>
      <body>
          <div>
              <script runat="server">
                  private void Page_Load(object sender, System.EventArgs e)
                  {
                      ReportViewer1.LocalReport.ReportPath = Server.MapPath("~/Reports/TestReport.rdlc");
                      ReportViewer1.LocalReport.Refresh();
                  }
              </script>
              <form id="Form1" runat="server">
              <asp:ScriptManager ID="ScriptManager1" runat="server">          
              </asp:ScriptManager>
              <rsweb:reportviewer id="ReportViewer1" runat="server" height="500" width="500" AsyncRendering="false"></rsweb:reportviewer>
              </form>        
          </div>
      </body>
      </html>
      

      ViewUserControl1.ascx

      ASPX 用户控件如下所示:

      <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
      <%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
          Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>
      <script runat="server">
        private void Page_Load(object sender, System.EventArgs e)
        {
            ReportViewer1.LocalReport.ReportPath = Server.MapPath("~/Reports/TestReport.rdlc");
            ReportViewer1.LocalReport.Refresh();
        }
      </script>
      <form id="Form1" runat="server">
      <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
      <rsweb:ReportViewer ID="ReportViewer1" runat="server" AsyncRendering="false"></rsweb:ReportViewer>
      </form>
      

      ASPXUserControl.cshtml

      剃刀视图。需要 ViewUserControl1.ascx。

      @{
          ViewBag.Title = "ASPXUserControl";
          Layout = "~/Views/Shared/_Layout.cshtml";
      }
      <h2>ASPXUserControl</h2>
      @Html.Partial("ViewUserControl1")
      

      参考文献

      http://blogs.msdn.com/b/sajoshi/archive/2010/06/16/asp-net-mvc-handling-ssrs-reports-with-reportviewer-part-i.aspx

      bind report to reportviewer in web mvc2

      【讨论】:

      • 幸运的是,当我尝试为自己解决问题并通过所有有意义的更改更新我的答案时,我仍然拥有我的测试应用程序。 ASPX 页面位于同一个 MVC3 Web 应用程序中。我的测试应用没有使用任何特殊的路由,你肯定有不相关的问题。
      • 您是否使用 ServerReports 对其进行了测试。因为它为我呈现了初始报告页面,但是当我单击控件中的任何按钮(例如“下一页”)时,它什么也不做。
      • 我对 ServerReports 也有同样的问题,第一页渲染得很好,但任何回调都没有产生任何结果。
      • 我遇到了与@rudimenter 相同的问题,并通过制作一个带有代码的真正 WebForm 并将其粘贴在 Razor 视图的 iframe 中来解决它。我现在有一个功能齐全的 ReportViewer
      • @AdrianToman 请更新答案以表明它仅适用于首页,以免未来的读者不必为此浪费时间
      【解决方案7】:

      你不仅要使用 asp.net 页面,而且

      如果使用 Entity Framework 或 LinqToSql(如果使用部分类)将数据移动到单独的项目中,则报表设计者无法看到这些类。

      将报告移动到另一个项目/dll,VS10 有错误是 asp.net 项目无法在 Web 应用程序中看到对象数据源。然后将 dll 中的报告流式传输到您的 mvc 项目 aspx 页面中。

      这适用于 mvc 和 webform 项目。在本地模式下使用 sql 报表并不是一个愉快的开发体验。如果导出大型报告,还要注意您的网络服务器内存。报表查看器/导出的设计非常糟糕。

      【讨论】:

        【解决方案8】:

        文档指的是 ASP.NET 应用程序。
        你可以试试看我的回答here
        我的回复中有一个示例。
        可以找到 ASP.NET MVC3 的另一个示例here

        【讨论】:

          猜你喜欢
          • 2010-12-20
          • 1970-01-01
          • 1970-01-01
          • 2011-12-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多