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 !
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.