54 votes

Affichage des rapports SSRS dans un site ASP.net MVC

Existe-t-il un moyen de placer un contrôle de visualisation de rapport SQL Server Reporting Services sur une vue MVC ASP.net ? Si ce n'est pas le cas, quelle est la meilleure façon de le faire ?

0 votes

Je suggère d'ajouter un autre site Web avec le ReprtViewer et les WebForms de la vieille école et de le faire pointer comme un sous-dossier du site Web principal ou même d'utiliser un IFRAME. C'est une solution propre.

17voto

Mike Hildner Points 536

Non, pas dans une vue MVC. Mais vous pouvez avoir des pages de formulaires Web contenant des contrôles de serveur mélangés à votre site MVC.

Hmm, je viens de googler "mix asp.net mvc et web forms" pour trouver des exemples, et google m'a demandé si je suis humain ou non :)

Quoi qu'il en soit, voici un lien - http://www.packtpub.com/article/mixing-asp.net-webforms-and-asp.net-mvc - il y en a quelques-uns. Je l'ai également fait dans un site MVC pour la même raison - le contrôle des rapports.

0 votes

Merci. J'ai pensé que cela pourrait être le cas. Lorsque vous ajoutez une page WebForms à votre application MVC, y a-t-il un moyen de créer une "route" qui vous permettra d'avoir une jolie URL au lieu de voir quelque chose comme www.foobar.com/reports/report.aspx ?

2 votes

Oui, il y en a - quelle version d'asp.net utilisez-vous ? Si c'est la 4.0, vérifiez le blog de ScottGu - weblogs.asp.net/scottgu/archive/2009/10/13/ . Sinon, je ne suis pas sûr - je ne l'ai pas fait.

15voto

Brant Bobby Points 4540

Non, le contrôle ReportViewer ne fonctionnera pas si vous le placez dans une vue MVC, car il nécessite ViewState. Vous devrez créer un formulaire Web à l'ancienne et y placer le ReportViewer à la place.

Une solution que j'ai utilisée dans le cadre d'un projet sur lequel je travaillais consistait à créer un gestionnaire de route personnalisé, afin de pouvoir continuer à utiliser le routage par URL. Le gestionnaire de route prenait des paramètres tels que le nom du rapport dans la collection RouteData, créait une instance de mon formulaire Web et lui transmettait les paramètres via des propriétés publiques. Le formulaire Web les lirait dans Page_Load et configurerait le contrôle ReportViewer.

// Configure a route in Global.asax.cs that is handled by a ReportRouteHandler
routes.Add("ReportRoute", new Route("Reports/{reportName}",
                                    new ReportRouteHandler());

public class ReportRouteHandler : IRouteHandler {
    public IHttpHandler GetHttpHandler(RequestContext requestContext) {
        var reportName = requestContext.RouteData.Values["reportName"] as string;

        var webform = BuildManager
            .CreateInstanceFromVirtualPath("~/Path/To/ReportViewerWebForm.aspx",
                                           typeof(Page)) as ReportViewerWebForm;
        webform.ReportToShow = reportName;
        return webform;
    }
}

Ce code n'est qu'un point de départ si vous décidez d'utiliser cette approche, bien sûr. Celui que j'ai créé effectue également une authentification de l'utilisateur et une validation des paramètres avant le retour.

Mise à jour : On dirait que si vous utilisez ASP.NET 4.0, la plupart de ces opérations peuvent être effectuées automatiquement !

12voto

Hayu Rahiza Points 92

Il y a maintenant une aide MvcReportViewer. Nous pouvons l'obtenir à partir de NuGet.

Site du projet sur GitHub

Paquet NuGet

0 votes

Les deux liens que vous avez fournis sont la même URL.

4voto

Leon Points 9

Ceci est un peu simple et nécessitera un peu de correction pour passer quelque chose de décent à une vue dans MVC.

public ActionResult Index()
{
    /*Credentials of a user that has access to SSRS*/
    string userid = "UserId";
    string password = "MyPassword";
    string domain = "MyDomain";

    string reportURL="http://ServerName/ReportServer?/ReportsFolder/ReportName&Parameter=UserName&rs:Command=Render&rs:Format=PDF";

    NetworkCredential nwc = new NetworkCredential(userid, password, domain);

    WebClient client = new WebClient();
    client.Credentials = nwc;

    Byte[] pageData = client.DownloadData(reportURL);

    Response.ContentType = "application/pdf";
    Response.AddHeader("Content-Disposition", "attachment; filename=" + DateTime.Now);
    Response.BinaryWrite(pageData);
    Response.Flush();
    Response.End();

    //return View();
    }

2 votes

Comment ça, un peu de réparation ?

0 votes

Salut mon pote. J'utilise votre méthode pour télécharger un fichier SSRS basé sur une URL. J'utilise les informations d'identification par défaut du webclient et j'essaie de renvoyer à l'utilisateur un fichier PDF. Mais l'utilisateur reçoit un fichier PDF de taille non nulle qui est vide. Avez-vous rencontré le même problème ?

0 votes

Méthode ActionResult avec retour View() commenté. ? ?

3voto

Johncl Points 375

Une solution simple consiste à ajouter une iframe à votre vue MVC qui ouvre le rapport souhaité à partir du service Web de reporting. L'iframe sera entièrement opérationnel avec les composants des services de reporting. Les paramètres utilisés pour l'url dans l'iframe peuvent également être contrôlés dynamiquement (par exemple avec ajax) si vous souhaitez déplacer les composants dans votre vue MVC.

Bien que cela fonctionne, vous devrez toujours vous connecter au service de reporting Web (l'iframe ouvrira une boîte de dialogue de connexion). Pour IE, cela se fait "automatiquement" en utilisant vos informations d'identification Windows.

0 votes

Si l'utilisateur visualise la source, comment cacher l'absoluteur du rapport SSRS ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X