Visualizar Reporting Services con MVC - SSRS

Acá les muestro como integrar Reporting Services a un proyecto MVC.

  • Primero colocaremos en el Web.Config unas variables para hacer "dinámico" o al menos no tener que recompilar para actualizar alguna credencial y/o dirección del reporting services.





  • Instalar el Nuget ReportViewerForMvc
PM> Install-Package ReportViewerForMvc -Version 1.1.1
  • Añadimos una carpeta a la solución para colocar la página que va a invocar el Reporting Service. La carpeta la llamaremos, ReportViewer y la página Report.aspx
@ Page Language="C#" AutoEventWireup="true" CodeBehind="Report.aspx.cs" Inherits="Client.ReportViewer.Report" %>

<%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"
    Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>

<%--<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">--%>
<!doctype html>
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE11">

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>Reportes - ICGES</title>
    <script type="text/javascript" src="/Scripts/reportViewer/jquery-1.11.0.min.js"></script>
    <script type="text/javascript" src="/Scripts/reportViewer/jquery-migrate-1.2.1.min.js"></script>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:ScriptManager ID="scriptManagerReport" runat="server" ScriptMode="Release"></asp:ScriptManager>

            <rsweb:ReportViewer runat="server" ShowPrintButton="true"
                Width="99.9%" Height="100%" ZoomMode="Percent" KeepSessionAlive="true" SizeToReportContent="True" AsyncRendering="false"
                ID="rptViewer">
            </rsweb:ReportViewer>
        </div>
    </form>
</body>
</html>

En el CodeBehind de la página debe ir algo como esto:

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                var pathReport = Request.QueryString["screen"];
                var usr = Request.QueryString["usr"];
                var token = Request.QueryString["t"];
                var reportType = Request.QueryString["tr"];
                var pathReportReal = string.Empty;
                

                var param = new List<ReportParameter>();

                if (string.IsNullOrEmpty(pathReport))
                    throw new Exception("Error en Parámetros");

                switch (pathReport)
                {
                    case "/Ejemplo1":
                        pathReportReal = "/formulario-SolicitudEntrevista";
                        p1 = Request.QueryString["p1"];
                        if (string.IsNullOrEmpty(p1))
                            throw new Exception("Error en Parámetros");

                        param.Add(new ReportParameter("InterviewId", p1));
                        break;
              
                    default:

                    
                        throw new Exception("Error en Parámetros");
                }

                var url = ConfigurationManager.AppSettings["ReportServerUrl"].ToString(); 
                var prefix = ConfigurationManager.AppSettings["ReportServerPrefix"].ToString();

                rptViewer.ServerReport.ReportServerUrl = new Uri(url);
                rptViewer.ServerReport.ReportServerCredentials = new ReportCredentials();
                rptViewer.ServerReport.ReportPath = prefix + pathReportReal;
                rptViewer.ProcessingMode = ProcessingMode.Remote;
                rptViewer.ShowParameterPrompts = false;

                if (param.Count > 0)
                    rptViewer.ServerReport.SetParameters(param);

                rptViewer.ServerReport.Refresh();
            }
        }
        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);

            ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), this.ClientID, ";", true);
        }

    }
     public class ReportCredentials : IReportServerCredentials
    {
        public WindowsIdentity ImpersonationUser
        {
            get
            {
                return null;
            }
        }

        public ICredentials NetworkCredentials
        {
            get
            {

                var user = ConfigurationManager.AppSettings["ReportServerUser"].ToString();
                var pwd = ConfigurationManager.AppSettings["ReportServerPwd"].ToString(); ;
                var domain = ConfigurationManager.AppSettings["ReportServerDomain"].ToString();
                return new NetworkCredential(user, pwd, domain);
            }
        }

        public bool GetFormsCredentials(out Cookie authCookie, out string userName, out string password, out string authority)
        {
            authCookie = null;
            userName = null;
            password = null;
            authority = null;

            // Not using form credentials
            return false;
        }
    }
  • Procedemos a crear el controlador ReportsApp con un método genérico para recibir la información del reporte (esto puede ser customizado a la necesidad de cada proyecto)
[HttpGet]
        public ActionResult ReportTemplate(string rptName, string rptUrl)
        {
        var rptInfo = new ReportInfo();
        rptInfo.ReportURL = String.Format("../../ReportViewer/Report.aspx?screen=/{0}", rptInfo.ReportName);
            rptInfo.Width = 99;
            rptInfo.Height = 99;

            rptInfo.ReportURL = String.Format("{0}&p1={1}", rptInfo.ReportURL, rptInfo.p1);
        
            var sessionName = string.Format("report{0}", rptName);
            return PartialView(rptInfo);
        }
  • Generamos un pequeño modelo para manejar la informacioón del reporte que estamos invocando.
 public class ReportInfo
    {
        public int ReportId { get; set; }
        public string ReportName { get; set; }
        public string ReportDescription { get; set; }
        public string ReportURL { get; set; }
        public int Width { get; set; }
        public int Height { get; set; }
        public string ReportSummary { get; set; }
        public string p1 { get; set; }
        public string p2 { get; set; }
        public string p3 { get; set; }
        public string p4 { get; set; }
        public string p5 { get; set; }
        public string p6 { get; set; }
        public string token { get; set; }
    }
  • Creamos la vista ReportTemplate, la cual usaremos para invocar la página aspx con el siguiente código:
@model BusinessModel.ReportsApp.ReportInfo
@{
    ViewBag.Title = Model.ReportDescription;
}
<h3>
    @Model.ReportDescription
</h3>

<iframe id="frmReport" src="@Model.ReportURL" frameborder="0" style="@String.Format("width:{0}%; height: {1}%;", Model.Width, Model.Height)" scrolling="no"></iframe> 

Listo!!

Show Comments

Get the latest posts delivered right to your inbox.