MVC3 Razor VS2010 ReportViewer示例

时间:2012-01-19 11:14:34

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

有人能指出我在mvc3中显示报告的工作示例,即完整的代码,我看了一些例子,看起来他们会做这个工作但是后来爆炸了,我知道ASPX页面是必需的,How can I use a reportviewer control in an asp.net mvc 3 razor view?似乎有一个很好的例子 当我创建一个干净的应用程序时,我得到 Microsoft JScript 运行时错误:'Microsoft'未定义我知道它可能很简单,但是因为我使用 Rdlc 文件已经有一段时间了显示通过 xml数据源填充的简单报告的东西会很棒,提前谢谢

1 个答案:

答案 0 :(得分:2)

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

  1. 在解决方案中创建一个文件夹并命名为 报告
  2. 添加一个ASP.Net网络表单并将其命名为 ReportView.aspx
  3. 创建课程 ReportData ,并将其添加到 报告 文件夹中。将以下代码添加到类中。

    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)
            {
                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();
            }
        }
    
    1. 将文件夹添加到 报告 文件夹并将其命名为 报告 。现在,将 RDLC 报告添加到 报告/报告 文件夹,并将其命名为 ClosingInventory。 RDLC 即可。

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

          public ActionResult ReportViewer()
          {                
              ViewData["reportUrl"] = "../Reports/View/local/ClosingInventory/";
      
              return View();
          }
      
    3. 添加视图页面,然后单击 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" />
      
       }
      
    4. 添加 iframe 。设置Iframe的属性如下

        frameborder="0"  width="1000"; height="1000"; style="overflow:hidden;" scrolling="no"
      
    5. 将以下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;
      }
      
    6. Web.config 文件将以下密钥添加到 appSettings 部分

      add key="UnobtrusiveJavaScriptEnabled" value="true"
      
    7. system.web 处理程序 部分添加以下密钥

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