2014-02-19 7 views
11

Referenz verwendet KB306355: How to create custom error reporting pages in ASP.NET by using Visual C# .NETASP.NET benutzerdefinierte Fehlerseite für Web App, die eine Master-Seite

Ich verstehe, wie eine benutzerdefinierte Fehler-Seite zu erstellen. Es gibt viele Beispiele dafür, wie im obigen Link.

Keines der Beispiele, die ich gefunden habe, zeigt, wie man macht, wonach ich suche.

Ich habe eine Webanwendung, die eine Masterseite verwendet.

In meiner Master-Seite, ich habe ein Kontrollschild für Fehler verwendet, die alle Seiten sehen:

<h4 id="bannerError"><asp:Label ID="lblError" runat="server" /></h4> 

In der Code-behind an dieser Master-Seite, ich habe dies:

public void Page_Error(object sender, EventArgs e) { 
    var err = Server.GetLastError().GetBaseException(); 
    ErrorMessage = String.Format("URL {0}: {1} Error: {2}", Request.Url, err.GetType(), err.Message); 
    Server.ClearError(); 
} 

public string ErrorMessage { 
    get { return lblError.Text; } 
    set { 
    LogError(value); 
    lblError.Text = value; 
    } 
} 

Die ErrorMessage ist eine Eigenschaft. Meine anderen Seiten können leicht darauf zugreifen, und ich war in der Lage, den Teil über das Schreiben des Fehlers in die Datenbank unseres Servers leicht zu bearbeiten.

Die Web.config Seite Konfiguration (Snippet):

<?xml version="1.0"?> 
<configuration> 
    <system.web> 
    <compilation debug="true" targetFramework="4.0"/> 
    <customErrors defaultRedirect="Default.aspx" mode="On"> 
     <error statusCode="403" redirect="Default.aspx" /> 
     <error statusCode="404" redirect="Default.aspx" /> 
    </customErrors> 
    </system.web> 
</configuration> 

Wie würde ich meine Dateien bearbeiten, so dass Fehler, die auf jedem meiner Seiten in meiner Anwendung auftreten (die von Master-Seite ableiten), einfach, dies zeigen grundlegende Informationen über die Masterseite, anstatt die Seite auf eine andere URL umzuleiten?

+0

Ich weiß, das war nicht die Frage, aber eine Alternative wäre, dies in der 'global.asax'' Application_Error' Methode zu behandeln. http://msdn.microsoft.com/en-us/library/24395wz3(v=vs.100).aspx –

+0

Danke @EladLachmi. Ich glaube, das mache ich jetzt. Ich war auf der Suche nach einer eleganteren Herangehensweise, die in meiner Master Page eingepackt ist. – jp2code

+0

Wir haben eine sehr große Site mit vielen Masterseiten und der einzige konsistente Weg, den wir gefunden haben, alle Ausnahmen zu protokollieren/auf Fehlerseiten umzuleiten, ist für alle Arten von Exceptions, die in unserer Anwendung geworfen werden. –

Antwort

2

Sie können keine Steuerelemente verwenden, um die Fehlermeldung für nicht behandelte Seitenfehler festzulegen, da keine Steuerelemente erstellt werden (siehe MS article). Sie könnten Fehler auf der Seite Ebene fangen und die Master-Seite Inhalt wie folgt festgelegt:

protected override void OnError(EventArgs e) { 
     var err = Server.GetLastError().GetBaseException(); 
     var errorMessage = String.Format("URL {0}: {1} Error: {2}", Request.Url, err.GetType(), err.Message); 
     ((MyMasterPageClass)Master).ShowError(errorMessage); 
     Server.ClearError();    
    } 

Und dann in der Master-Seite stellen Sie die Inhalte direkt:

public void ShowError(string message) { 
     Response.Write(string.Format("<h4 id=\"bannerError\">{0}</h4>", message)); 
    } 

Aber auch hier Ihre Master-Seite wouldn‘ Ich rende sowieso, so dass es den Zweck irgendwie besiegt. Wenn Sie wirklich das Umleiten auf eine Fehlerseite vermeiden möchten, können Sie den Inhalt mit Ajax laden so etwas wie jQuery.get mit() und dann die Ergebnisse/Fehler angezeigt werden je nach Bedarf:

var request = $.get("www.mywebsite.com/Bugs2012.aspx"); 

request.done(function (data) { 
    $("#childContent").html(data); 
}); 

request.fail(function (xhr, status, msg) { 
    var displayMsg = "Request could not be completed. "; 
    if (status === "error") { 
     switch (xhr.status) { 
      case 404: 
       displayMsg += "The content could not be found."; 
       break; 
     } 
    } 
    $("#bannerError").text(displayMsg); 
}); 

Ich habe versucht, zu erstellen ein jsfiddle, aber es ist ein bisschen gekünstelt wegen der Cross-Domain-ajax-Themen: js fiddle

+0

Könnten Sie ein Beispiel dafür zeigen, wie jQuery auftauchen würde, wenn jemand versuchte, auf eine Seite zuzugreifen, die meine Website nicht mehr enthält, wie diese alte Datei "www.mywebsite.com/Bugs2012.aspx"? – jp2code

+1

Sicher, es gibt ein paar verschiedene Möglichkeiten, wie Sie es tun könnten. Wenn Sie $ .get() verwendet haben, dann würden Sie den Antwortstatuscode im .fail() - Callback überprüfen, wenn Sie 404 verwenden, würden Sie Ihre Nachricht entsprechend setzen. Sie können auch $ .ajax() verwenden und die statusCode-Eigenschaft verwenden, um Rückrufe für jeden statusCode hinzuzufügen. Das gefällt mir auch nicht, weil es die Möglichkeit bietet, die Fehlerbehandlung unnötig zu teilen. Ich bearbeite meine Antwort, um ein Beispiel mit $ .get() zu zeigen. – Sprockincat

2

ich weiß, die Frage war, wie die MasterPage Lösung zu arbeiten, aber ich denke, dass die Anwendungsebene mit Error Ereignisse ist die beste Möglichkeit, einen Catch-All-Error-Handler zum Weiterleiten an eine Fehlerseite zu machen.

Sie müssen unbedingt die Application_Error in der Global.asax Datei behandeln. Hier können Sie nicht nur alle Fehler auf Seitenebene, sondern auch Fehler auf Anwendungsebene und HTTP-Fehler einiger Typen behandeln (wenn sie Ihre Anwendungs-Pipeline erreichen können).

Ich denke, das ist eine bessere und mehr zentralisierte Methode. Das Hinzufügen von Fehlerereignishandlern auf MasterPage- oder BasePage-Ebene ist ebenfalls möglich, jedoch als zweite Ebene.

Schauen Sie here für ein gutes Beispiel dafür.

Verwandte Themen