2009-09-17 8 views
2

J'ai une page de rapport qui utilise le composant Microsoft.Reporting.WebForms.ReportViewer pour rendre les rapports Report Server (SSRS) de manière asynchrone. Au moment où une erreur se produit, un message est affiché dans le contrôle ReportViewer.Gestion des exceptions rapport à l'aide du ReportViewer ASP.NET en mode Remote et Async

Je veux ajouter une logique de traitement d'erreur personnalisée afin que l'utilisateur reçoit un message amical. Comment puis-je y parvenir et toujours exécuter le visualiseur en mode Async, rendant les rapports sur le serveur SSRS?

L'écoute de l'événement ReportViewer.HandleError ne fonctionnera pas comme postback page a déjà terminé.

+0

exception ce que vous obtenez? –

+0

erreurs personnalisées générées dans le rapport Sproc, mais cela devrait être hors de propos que je veux traiter ces erreurs, ne pas les résoudre. –

Répondre

1

Après avoir inspecté le JavaScript ReportViewer, je suis venu avec la solution suivante. Il est sujet à casser des choses si Microsoft change cette méthode particulière. Le code suivant serait ajouté à l'en-tête de la page pour vous assurer qu'il court après le javascript ReportViewer est chargé, mais avant une instance de la RSClientController est créée.

// This replaces a method in the ReportViewer javascript. If Microsoft updates 
// this particular method, it may cause problems, but that is unlikely to 
// happen.The purpose of this is to redirect the user to the error page when 
// an error occurs. The ReportViewer.ReportError event is not (always?) raised 
// for Remote Async reports 
function OnReportFrameLoaded() { 
    this.m_reportLoaded = true; 
    this.ShowWaitFrame(false); 

    if (this.IsAsync) 
    { 
     if(this.m_reportObject == null) 
     { 
      window.location = 
       '<%= HttpRuntime.AppDomainAppVirtualPath %>/Error.aspx'; 
     } 
     else 
     { 
      this.m_reportObject.OnFrameVisible(); 
     } 
    } 
} 
RSClientController.prototype.OnReportFrameLoaded = OnReportFrameLoaded; 

Le code d'origine à partir du fichier de script Microsoft ReportViewer (dans les Microsoft.ReportViewer.WebForms, 8.0.0.0, Net Framework 3.5 SP1) est:

function OnReportFrameLoaded() 
{ 
    this.m_reportLoaded = true; 
    this.ShowWaitFrame(false); 

    if (this.IsAsync && this.m_reportObject != null) 
     this.m_reportObject.OnFrameVisible(); 
} 
RSClientController.prototype.OnReportFrameLoaded = OnReportFrameLoaded; 
+0

Bonne idée. Nous pouvons l'utiliser nous-mêmes .. – gbn

Questions connexes