См. файл rdlc в приложении MVC Razor.

Пытаюсь показать в представлении rdlc Razor. Внедрите элемент управления ReportViewer в элемент управления ascx, который будет передавать данные.

Проблема в том, что элемент управления ReportViewer для рисования отчета формирует постбэк, а перезагружая страницу из Razor, я теряю объект Page, на который не могу сделать постбэк.

Может кто-нибудь помочь мне? Есть ли помощник для использования элемента управления ReportViewer в Razor?


person user1005831    schedule 20.10.2011    source источник
comment
Это интересная проблема, с которой я скоро столкнусь. Извините, но я не могу вам помочь.   -  person Mike Wills    schedule 21.10.2011


Ответы (1)


Это простая задача. Вы можете выполнить следующие шаги.

  1. Создайте папку в своем решении и назовите ее Reports.
  2. Добавьте веб-форму ASP.Net и назовите ее 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. Добавьте два NameSpace в ReportView.aspx.cs

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

    Измените 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();
        }
    }
    
  7. Добавьте папку в папку Отчеты и назовите ее Отчет. Теперь добавьте отчет RDLC в папку Reports/Report и назовите его 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 handlers добавьте следующий ключ

     add `verb="*" path="Reserved.ReportViewerWebControl.axd" type = "Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"`
    
  13. Измените источник данных как свой собственный. Это решение очень простое, и я думаю, что оно понравится всем.

person Md. Nazrul Islam    schedule 16.06.2012
comment
Что такое RASolarERPData и ClosingInventoryReport? Ваш код не скомпилируется без них? - person ProfK; 20.07.2013
comment
Почему ваша форма называется Login? - person ProfK; 31.07.2013