2011-10-20 42 views
1

我尝试在视图rdlc Razor中显示。将ReportViewer控件嵌入到将传递数据的ascx控件中。在MVC Razor应用中查看rdlc文件

问题是,ReportViewer控件绘制报表生成回发,并从剃刀重新加载页面,我失去了Page对象,我无法回发。

任何人都可以帮助我吗? 是否有帮助者在Razor中使用ReportViewer控件?

+0

这是一个很有趣的问题,我很快就会发现。对不起,我帮不了你。 –

回答

2

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

  1. 创建解决方案中的一个文件夹,并赋予一个名字报告
  2. 添加ASP.Net Web表单,并把它命名为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. 添加的ScriptManagerReportView.aspx页。现在将报表查看器添加到页面。在报告查看器中设置属性AsyncRendering =“false”。代码如下。

    <rsweb:ReportViewer ID="ReportViewerRSFReports" runat="server" AsyncRendering="false" 
         Width="1271px" Height="1000px" > 
        </rsweb:ReportViewer> 
    
  6. 添加两个命名空间ReportView.aspx.cs

    using Microsoft.Reporting.WebForms; 
    using System.IO; 
    

    更改System.Web.UI.PageReportBasePage。只需使用以下代码替换您的代码。

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

  8. 现在添加控制器和它命名为ReportController。在控制器中添加以下操作方法。

    public ActionResult ReportViewer() 
        {     
         ViewData["reportUrl"] = "../Reports/View/local/ClosingInventory/"; 
    
         return View(); 
        } 
    
  9. 添加视图页面上点击的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" /> 
    
        } 
    
  10. 添加的iFrame。设置Iframe的属性如下

    frameborder="0" width="1000"; height="1000"; style="overflow:hidden;" scrolling="no" 
    
  11. 向浏览器添加以下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; 
    } 
    
  12. 的Web.config文件中添加以下关键的appSettings部分

    添加

    key="UnobtrusiveJavaScriptEnabled" value="true"

    的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"` 
    
  13. 更改您的数据源,你自己的。这个解决方案非常简单,我认为每个人都喜欢它。

+0

什么是“RASolarERPData”和“ClosingInventoryReport”?没有他们的代码就不会编译? – ProfK

+0

为什么你的表单叫做'Login'? – ProfK