visual studio reports mvcreportviewer mvc ejemplo c# asp.net asp.net-mvc reporting-services

c# - reports - report viewer visual studio 2017 mvc



MVC5 y SSRS ReportViewer-¿Cómo implementar? (1)

tiene que usar una página ASPX, simplemente agregue una nueva carpeta (por ejemplo, WebForms) debajo de la raíz de su aplicación MVC y agregue un nuevo formulario web ASPX en ella.

en la página aspx puedes agregar el reportviewer

<rsweb:ReportViewer ID="reportViewer" runat="server" Width="100%" Height="800" CssClass="reportViewer" ShowPrintButton="False"> </rsweb:ReportViewer>

en el código detrás de la página aspx

protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { if (!string.IsNullOrEmpty(Request.QueryString["ReportFolder"])) { string reportpath = HttpUtility.HtmlDecode(Request.QueryString["ReportFolder"]); int aantalKeys = Request.Params.AllKeys.Length; List<ReportParameter> parameters = new List<ReportParameter>(); for (int i = 1; i < aantalKeys; i++) { string value = Request.Params[i]; string key = Request.Params.Keys[i]; if (key.Contains("_RAP")) { int index = key.IndexOf(''_''); key = key.Substring(0, index); ReportParameter parameter = new ReportParameter(key, HttpUtility.HtmlDecode(value)); parameters.Add(parameter); } } this.RenderReport(reportpath, parameters); } } } private void RenderReport(string reportpath, List<ReportParameter> parameters = null) { string User = [ReportserverUser]; string Pass = [ReportserverPass]; string ReportServerUrl = [ResportserverUrl]]; IReportServerCredentials irsc = new CustomReportCredentials(User, Pass, ""); Uri uri = new Uri(ReportServerUrl); int lastSegment = uri.Segments.Length - 1; string page = uri.Segments[lastSegment]; // EVENTS //reportViewer.Load += reportViewer_Load; //reportViewer.Unload += reportViewer_Unload; reportViewer.Visible = true; reportViewer.ProcessingMode = Microsoft.Reporting.WebForms.ProcessingMode.Remote; reportViewer.ServerReport.ReportServerCredentials = irsc; reportViewer.ServerReport.ReportServerUrl = new Uri(uri.AbsoluteUri.Replace(page, "")); reportViewer.ServerReport.ReportPath = reportpath; if (parameters != null && parameters.Count != 0) { reportViewer.ServerReport.SetParameters(parameters); } reportViewer.ServerReport.Refresh(); } private Dictionary<string, object> GetCurrentParameters() { var parameterCollection = reportViewer.ServerReport.GetParameters(); var param = new Dictionary<string, object>(); foreach (var p in parameterCollection) { var name = p.Name; if (p.DataType == ParameterDataType.DateTime) { var d = Convert.ToDateTime(p.Values[0]); param[name] = d.ToString("dd-MM-yyyy"); } else { var values = p.Values.ToList(); param[name] = values; } } return param; }

con esto en su lugar, debería poder navegar a http: // localhost: port / webForms / yourpage.aspx? reportfolder = [reportpath] & param1_RAP = 1 & param2_RAP = ogjirewog

debe proporcionar el siguiente parámetro en el código subyacente: ReportserverUser y ReportserverPass: credenciales que pueden iniciar sesión en la interfaz del servidor de informes y acceder al informe. - Url del servidor de informes: esta es la url del servidor de informes Asxm webservice - reportpather: la ruta al informe en reportingserver (solo el nombre, sin extensión al final)

He pasado horas intentando resolver esto y hasta ahora puedo encontrar soluciones basadas en MVC1, MVC2 y MVC3, pero nada sobre MVC5 y el uso de SSRS y ReportViewer. Francamente, no conozco WebForms, ya que me uní al mundo de la programación después de que MVC fuera una gran cosa en la tienda donde trabajo. Suficiente historia de fondo, lo abordaré.

Yo tengo:

  • Escrito un procedimiento almacenado
  • Usé las herramientas de Business Intelligence en VS 2013 para diseñar mi informe
  • Visto el informe en el diseñador y sé que es bueno
  • Intento integrar el ReportViewer en mi aplicación sin éxito
  • Determinado, parece que necesito volver a ejecutar mi llamada de consulta (a pesar de estar en el diseño del informe) y el código escrito para hacer esto, usando un conjunto de fechas de prueba
  • Determinado WebForms de alguna manera está involucrado en hacer que mi informe se muestre en mi aplicación.

Así que llegué al punto en el que creo que solo necesito el archivo aspx para hacer lo que tengo que hacer. Si alguien puede analizar esto y ayudarme, me curarás de muchas horas de estrés.

Primero, un fragmento de mi archivo RouteConfig.cs:

routes.IgnoreRoute("{resource}.aspx/{*pathInfo}"); routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }

Mi código de controlador de informes:

[HttpPost] public ActionResult GetSysWideQuizReport([Bind(Include = "Topic, Date1, Date2")] QuizReporting quizParams) { ReportViewer ReportViewer1 = new ReportViewer(); ReportViewer1.ProcessingMode = ProcessingMode.Local; ReportViewer1.LocalReport.ReportPath = Request.MapPath(Request.ApplicationPath) + @"Reports/System Quiz Report.rdl"; ReportDataSource source = new ReportDataSource("DataSet1", QuizData(quizParams)); ReportViewer1.LocalReport.DataSources.Clear(); ReportViewer1.LocalReport.DataSources.Add(source); return View(ReportViewer1); } private DataTable QuizData(QuizReporting quizParams) { DataSet ds = new DataSet("DataSet1"); using(SqlConnection connection = new SqlConnection()) { connection.ConnectionString = GetConnectionString(); SqlCommand cmd = new SqlCommand("SystemQuizReport", connection); //cmd.CommandText = "EXEC SchoolQuizReport @TopicID, @Date1, @Date2"; cmd.Parameters.AddWithValue("@TopicID", quizParams.Topic.TopicID); cmd.Parameters.AddWithValue("@Date1", "2015/04/13"); cmd.Parameters.AddWithValue("@Date2", "2015/04/16"); cmd.CommandType = CommandType.StoredProcedure; SqlDataAdapter da = new SqlDataAdapter(); da.SelectCommand = cmd; da.Fill(ds); return ds.Tables[0]; } } static private string GetConnectionString() { return "Data Source=(localdb)//v11.0; Initial Catalog=UCAPDB-20140822124213; Integrated Security=True;"; }

Y mi código "Ver" (realmente aspx):

<%@ 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"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> <rsweb:ReportViewer ID="ReportViewer1" runat="server" Width="600"> </rsweb:ReportViewer> </form> </body> </html>

Mi error actual es:

La vista en ''~ / Views / Reporting / GetSysWideQuizReport.aspx'' debe derivar de ViewPage, ViewPage, ViewUserControl o ViewUserControl.

ACTUALIZAR

He intentado la solución de sugerencia a continuación y al parecer no lo hago muy bien. Así que continué y convertí el RDL en un RDLC y usé el asistente de diseño para insertar la llamada en el ReportViewer de la página ASPX. Ahora recibo toda una serie de extraños errores AJAX.

Actualizado GetSysWideQuizReport.aspx:

<%@ 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"> <%@ Page language="C#" %> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Quiz Report</title> </head> <body> <form id="form1" runat="server"> <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> <rsweb:ReportViewer ID="ReportViewer1" runat="server" Width="915px" Height ="1000px" Font-Names="Lato" Font-Size="10pt" ShowBackButton="False" ShowRefreshButton="False" WaitMessageFont-Names="Verdana" WaitMessageFont-Size="14pt"> <LocalReport ReportPath="ReportViews/System Quiz Report.rdlc"> <DataSources> <rsweb:ReportDataSource DataSourceId="LocalDb" Name="DataSet1" /> </DataSources> </LocalReport> </rsweb:ReportViewer> <asp:SqlDataSource ID="LocalDb" runat="server" ConnectionString="<%$ ConnectionStrings:LocalDb %>" SelectCommand="SystemQuizReport" SelectCommandType="StoredProcedure"> <SelectParameters> <asp:FormParameter FormField="TopicID" Name="TopicID" Type="Int32" /> <asp:FormParameter DbType="DateTime2" FormField="Date1" Name="Date1" /> <asp:FormParameter DbType="DateTime2" FormField="Date2" Name="Date2" /> </SelectParameters> </asp:SqlDataSource> </form> </body> </html>

El formulario de usuario se publica directamente en esta página aspx. Ahora para mis errores:

Uncaught SyntaxError: Unexpected token < ScriptResource.axd:1 Uncaught SyntaxError: Unexpected token < GetSysWideQuizReport.aspx:40 Uncaught Error: ASP.NET Ajax client-side framework failed to load. ScriptResource.axd:1 Uncaught SyntaxError: Unexpected token < Reserved.ReportViewerWebControl.axd:1 Uncaught SyntaxError: Unexpected token < ScriptResource.axd:1 Uncaught SyntaxError: Unexpected token < GetSysWideQuizReport.aspx:49 Uncaught ReferenceError: Sys is not defined GetSysWideQuizReport.aspx:114 Uncaught ReferenceError: Sys is not defined GetSysWideQuizReport.aspx:55 Uncaught ReferenceError: $get is not defined