Comment puis-je utiliser un contrôle reportviewer dans un asp.net mvc 3 rasoir?

j'essaie d'utiliser un contrôle reportviewer, dans une vue de rasoir, dans le cadre mvc 3. Le documentation en ligne parle de glisser-déposer. Toute suggestion sur la façon de l'insérer dans la vue.

60
demandé sur Adrian Toman 2011-05-27 00:15:51

8 réponses

la solution suivante ne fonctionne que pour les rapports d'une seule page. Reportez-vous aux commentaires pour plus de détails.

ReportViewer est un contrôle de serveur et ne peut donc pas être utilisé dans une vue de rasoir. Cependant, vous pouvez ajouter une page de vue ASPX, voir le contrôle de l'utilisateur ou le formulaire Web traditionnel qui contient un ReportViewer dans l'application.

vous devez vous assurer que vous avez ajouté le handler pertinent dans votre Web.config .

si vous utilisez ASPX view page ou view user control, vous devrez définir Asyncrending to false pour que le rapport s'affiche correctement.

mise à jour:

a ajouté plus de code d'échantillon. Note Aucun changement significatif n'est requis dans Global.asax.

Web.Config

Mine a fini comme suit:

<?xml version="1.0"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=152368
  -->

<configuration>
  <appSettings>
    <add key="webpages:Version" value="1.0.0.0"/>
    <add key="ClientValidationEnabled" value="true"/>
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
  </appSettings>

  <system.web>
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
        <add assembly="Microsoft.ReportViewer.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
      </assemblies>
    </compilation>

    <authentication mode="Forms">
      <forms loginUrl="~/Account/LogOn" timeout="2880" />
    </authentication>

    <pages>
      <namespaces>
        <add namespace="System.Web.Helpers" />
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
        <add namespace="System.Web.WebPages"/>
      </namespaces>
    </pages>
  </system.web>

  <system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true"/>
    <handlers>
      <add name="ReportViewerWebControlHandler" preCondition="integratedMode" verb="*" path="Reserved.ReportViewerWebControl.axd" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </handlers>
  </system.webServer>

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

contrôleur

les actions du contrôleur sont très simples.

en bonus, L'action File() renvoie la sortie de" TestReport.rdlc" en tant que fichier PDF.

using System.Web.Mvc;
using Microsoft.Reporting.WebForms;

...

public class PDFController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public FileResult File()
    {
        ReportViewer rv = new Microsoft.Reporting.WebForms.ReportViewer();
        rv.ProcessingMode = ProcessingMode.Local;
        rv.LocalReport.ReportPath = Server.MapPath("~/Reports/TestReport.rdlc");
        rv.LocalReport.Refresh();

        byte[] streamBytes = null;
        string mimeType = "";
        string encoding = "";
        string filenameExtension = "";
        string[] streamids = null;
        Warning[] warnings = null;

        streamBytes = rv.LocalReport.Render("PDF", null, out mimeType, out encoding, out filenameExtension, out streamids, out warnings);

        return File(streamBytes, mimeType, "TestReport.pdf");
    }

    public ActionResult ASPXView()
    {
        return View();
    }

    public ActionResult ASPXUserControl()
    {
        return View();
    }
}

ASPXView.apsx

L'ASPXView est comme suit.

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
<%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
    Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>

<!DOCTYPE html>

<html>
<head runat="server">
    <title>ASPXView</title>
</head>
<body>
    <div>
        <script runat="server">
            private void Page_Load(object sender, System.EventArgs e)
            {
                ReportViewer1.LocalReport.ReportPath = Server.MapPath("~/Reports/TestReport.rdlc");
                ReportViewer1.LocalReport.Refresh();
            }
        </script>
        <form id="Form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server">          
        </asp:ScriptManager>
        <rsweb:reportviewer id="ReportViewer1" runat="server" height="500" width="500" AsyncRendering="false"></rsweb:reportviewer>
        </form>        
    </div>
</body>
</html>

ViewUserControl1.ascx

Le contrôle de L'utilisateur ASPX ressemble à:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
    Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>
<script runat="server">
  private void Page_Load(object sender, System.EventArgs e)
  {
      ReportViewer1.LocalReport.ReportPath = Server.MapPath("~/Reports/TestReport.rdlc");
      ReportViewer1.LocalReport.Refresh();
  }
</script>
<form id="Form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<rsweb:ReportViewer ID="ReportViewer1" runat="server" AsyncRendering="false"></rsweb:ReportViewer>
</form>

ASPXUserControl.cshtml

Rasoir vue. Nécessite ViewUserControl1.ascx.

@{
    ViewBag.Title = "ASPXUserControl";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>ASPXUserControl</h2>
@Html.Partial("ViewUserControl1")

Références

http://blogs.msdn.com/b/sajoshi/archive/2010/06/16/asp-net-mvc-handling-ssrs-reports-with-reportviewer-part-i.aspx

lier rapport pour reportviewer web mvc2

78
répondu Adrian Toman 2017-05-23 11:54:04

C'est une tâche simple. Vous pouvez suivre les étapes suivantes.

  1. créez un dossier dans votre solution et nommez-le rapports .
  2. Ajouter un ASP.Net web formulaire et nommez-le ReportView.aspx
  3. créer une classe ReportData et l'ajouter à la Rapports le dossier. Ajouter le code suivant à la classe.

    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. ajouter une autre classe et la nommer ReportBasePage.cs . Ajouter le code suivant dans cette classe.

    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. ajouter ScriptManager au ReportView.aspx de la page. Maintenant, ajoutez un " Report Viewer à la page. Dans report viewer mettre la propriété AsyncRendering="false" . Le code est donné ci-dessous.

        <rsweb:ReportViewer ID="ReportViewerRSFReports" runat="server" AsyncRendering="false"
            Width="1271px" Height="1000px" >
        </rsweb:ReportViewer>
    
  6. Ajouter les deux espace de Noms dans ReportView.aspx.cs

    using Microsoft.Reporting.WebForms;
    using System.IO;
    
  7. changer le système.Web.INTERFACE.Page à ReportBasePage . Il suffit de remplacer votre code en utilisant ce qui suit.

    public partial class ReportView : ReportBasePage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                RenderReportModels(this.ReportDataObj);
            }
        }
    
        private void RenderReportModels(ReportData reportData)
        {
            // This is the Data Access Layer from which a method is called to fill data to the list.
            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();
        }
    }
    
  8. Ajouter un dossier au rapports dossier et le nommer Rapport . Maintenant, ajoutez un RDLC rapport à l' Rapports/Rapport du dossier et nommez-le ClosingInventory.rdlc .

  9. ajouter maintenant un contrôleur et l'appeler ReportController . Dans le contrôleur ajouter la méthode d'action suivante.

    public ActionResult ReportViewer()
        {                
            ViewData["reportUrl"] = "../Reports/View/local/ClosingInventory/";
    
            return View();
        }
    
  10. ajouter une page de vue cliquez sur le ReportViewer contrôleur. Nommer la page de vue ReportViewer.cshtml . Ajouter le code suivant à la page view.

    @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" />
    
    }
    
  11. Ajouter un Iframe . Définir la propriété de L'Iframe comme suit

    frameborder="0"  width="1000"; height="1000"; style="overflow:hidden;"
    scrolling="no"
    
  12. ajouter JavaScript à l'écran.

    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;
    }
    
  13. Web.config fichier ajouter l'un des codes suivants à la appSettings de la section

    add key="UnobtrusiveJavaScriptEnabled" value="true"
    
  14. Dans système.web gestionnaires "1519170920 la Section" ajouter la clé suivante

    add verb="*" path="Reserved.ReportViewerWebControl.axd" type = "Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
    
  15. changez votre source de données pour la vôtre. Cette solution est très simple et je pense que tout le monde va l'apprécier.

12
répondu Md. Nazrul Islam 2013-11-26 06:47:19

j'utilise ASP.NET MVC3 avec SSRS 2008 et je ne pouvais pas faire travailler à 100% @Adrian pour moi en essayant d'obtenir des rapports à partir d'un serveur distant.

finalement, j'ai trouvé que j'avais besoin de changer la méthode Page_Load dans ViewUserControl1.ascx pour ressembler à ceci:

ReportViewer1.ProcessingMode = ProcessingMode.Remote;
ServerReport serverReport = ReportViewer1.ServerReport;
serverReport.ReportServerUrl = new Uri("http://<Server Name>/reportserver");
serverReport.ReportPath = "/My Folder/MyReport";
serverReport.Refresh();

il me manquait le mode de traitement .À distance .

, les Références:

http://msdn.microsoft.com/en-us/library/aa337091.aspx - ReportViewer

7
répondu wilsjd 2013-08-29 16:57:52

Voici la solution complète pour intégrer directement une commande de visionneuse de rapports (ainsi que toute asp.net contrôle côté serveur) dans un MVC .aspx view, qui fonctionnera également sur un rapport avec plusieurs pages (contrairement à la réponse D'Adrian Toman) et avec AsyncRendering mis à true, (basé sur "Pro ASP.NET MVC Framework" par Steve Sanderson).

Ce que l'on doit faire, c'est en gros:

  1. Ajouter un formulaire avec runat = "serveur"

  2. ajouter le contrôle, (pour les contrôles report-viewer il peut aussi parfois fonctionner même avec AsyncRendering= "True" mais pas toujours, donc vérifier dans votre cas spécifique)

  3. Ajouter des scripts côté serveur en utilisant des balises de script avec runat = "server",

  4. outrepasser L'événement Page_Init avec le code ci-dessous, pour permettre L'utilisation de PostBack et Viewstate

Voici une démonstration:

<form ID="form1" runat="server">
    <rsweb:ReportViewer ID="ReportViewer1" runat="server" />
</form>
<script runat="server">
    protected void Page_Init(object sender, EventArgs e)
    {
        Context.Handler = Page;
    }
    //Other code needed for the report viewer here        
</script>

il est bien sûr recommandé d'utiliser pleinement l'approche MVC, en préparant toutes les données nécessaires dans le contrôleur, puis en les passant à la vue via le modèle de vue.

cela permettra de réutiliser la vue!

cependant ceci est seulement dit pour les données cela est nécessaire pour chaque post back, ou même si elles sont requises seulement pour l'initialisation si elle est ne nécessite pas de données intensives, et les données ne doit pas non plus dépendre des valeurs PostBack et ViewState.

cependant, même les données intensives peuvent parfois être encapsulées dans une expression lambda puis passées à la vue pour y être appelées.

quelques notes cependant:

  • en faisant cela la vue se transforme essentiellement en un formulaire web avec tous ses inconvénients, (c.-à-d. Postbacks, et la possibilité de non Asp.NET contrôles obtenir surchargée)
  • Le hack de l'annulation de la Page_Init est sans-papiers, et il est sujet à des changements, à tout moment,
7
répondu yoel halb 2013-10-16 09:02:19

il y a un assistant MvcReportViewer à NuGet.

http://www.nuget.org/packages/MvcReportViewer /

Et voici les détails:

https://github.com/ilich/MvcReportViewer

j'ai utilisé ceci. Il fonctionne très bien.

6
répondu Hayu Rahiza 2013-12-02 06:39:26

la documentation se réfère à un ASP.NET application.

Vous pouvez essayer de jeter un oeil à ma réponse ici .

J'ai joint un exemple à ma réponse.

Un autre exemple pour ASP.NET MVC3 peut être trouvé ici .

1
répondu LeftyX 2017-05-23 12:17:44

vous aurez non seulement à utiliser un asp.net page but

si L'Utilisation du cadre D'entité ou LinqToSql (si l'utilisation de classes partielles) déplacer les données dans un projet séparé, le concepteur de rapport ne peut pas voir les classes.

Move the reports to another project / dll, VS10 has bugs were asp.net les projets ne peuvent pas voir les sources de données objet dans les applications web. Ensuite, streamez les rapports de la dll dans votre MVC projets aspx page.

This s'applique aux projets mvc et webform. Utiliser les rapports sql en mode local n'est pas une expérience de développement agréable. Surveillez également la mémoire de votre serveur web si vous exportez des rapports volumineux. Le reportviewer/export est très mal conçu.

1
répondu user965445 2011-12-13 18:39:47

il est possible d'obtenir un rapport SSRS pour apparaître sur une page MVC sans utiliser iFrames ou une page aspx.

l'essentiel du travail est expliqué ici:

http://geekswithblogs.net/stun/archive/2010/02/26/executing-reporting-services-web-service-from-asp-net-mvc-using-wcf-add-service-reference.aspx

le lien explique comment créer un service web et la méthode D'action MVC qui vous permettra de appelez le service de rapports et affichez le résultat du service web sous forme de fichier Excel. Avec une petite modification du code dans l'exemple, vous pouvez le rendre HTML.

Tout ce que vous devez faire alors est d'utiliser un bouton pour appeler une fonction javascript qui fait un appel AJAX à votre action MVC qui renvoie le HTML du rapport. Lorsque L'appel AJAX retourne avec le HTML, il suffit de remplacer un div par ce HTML.

nous utilisons AngularJS donc mon exemple ci-dessous est dans ce format, mais il pourrait s'agir de n'importe quelle fonction javascript

$scope.getReport = function()
{
    $http({
        method: "POST",
        url: "Report/ExportReport",
        data: 
                [
                    { Name: 'DateFrom', Value: $scope.dateFrom },
                    { Name: 'DateTo', Value: $scope.dateTo },
                    { Name: 'LocationsCSV', Value: $scope.locationCSV }
                ]

    })
    .success(function (serverData)
    {
        $("#ReportDiv").html(serverData);
    });

};

et la méthode D'Action - principalement à partir du lien ci-dessus...

    [System.Web.Mvc.HttpPost]
    public FileContentResult ExportReport([FromBody]List<ReportParameterModel> parameters)
    {
         byte[] output;
         string extension, mimeType, encoding;
         string reportName = "/Reports/DummyReport";
         ReportService.Warning[] warnings;
         string[] ids;

     ReportExporter.Export(
            "ReportExecutionServiceSoap" 
            new NetworkCredential("username", "password", "domain"),
            reportName,
            parameters.ToArray(),
            ExportFormat.HTML4,
            out output,
            out extension,
            out mimeType,
            out encoding,
            out warnings,
            out ids
        );

        //-------------------------------------------------------------
        // Set HTTP Response Header to show download dialog popup
        //-------------------------------------------------------------
        Response.AddHeader("content-disposition", string.Format("attachment;filename=GeneratedExcelFile{0:yyyyMMdd}.{1}", DateTime.Today, extension));
        return new FileContentResult(output, mimeType);
    }

ainsi le résultat est que vous obtenez de passer des paramètres à un serveur de rapports SSRS qui renvoie un rapport que vous rendez en HTML. Tout ce qui apparaît sur la page. C'est la meilleure solution que j'ai pu trouver

1
répondu Neil 2013-12-17 21:48:04