Ich benutze RC2
Verwenden des URL-Routings:
routes.MapRoute(
"Error",
"{*url}",
new { controller = "Errors", action = "NotFound" } // 404s
);
Das Obige scheint sich um Anfragen wie diese zu kümmern (unter der Annahme, dass Standard-Routentabellen vom ersten MVC-Projekt eingerichtet wurden): "/ blah / blah / blah / blah"
Überschreiben von HandleUnknownAction () im Controller selbst:
// 404s - handle here (bad action requested
protected override void HandleUnknownAction(string actionName) {
ViewData["actionName"] = actionName;
View("NotFound").ExecuteResult(this.ControllerContext);
}
Die vorherigen Strategien verarbeiten jedoch keine Anforderung an einen fehlerhaften / unbekannten Controller. Zum Beispiel habe ich kein "/ IDoNotExist". Wenn ich dies anfordere, erhalte ich die generische 404-Seite vom Webserver und nicht meine 404, wenn ich Routing + Override verwende.
Schließlich lautet meine Frage: Gibt es eine Möglichkeit, diese Art von Anforderung über eine Route oder etwas anderes im MVC-Framework selbst abzufangen?
ODER sollte ich standardmäßig Web.Config customErrors als meinen 404-Handler verwenden und all dies vergessen? Ich gehe davon aus, dass ich bei Verwendung von customErrors die generische 404-Seite aufgrund der Einschränkungen von Web.Config für den direkten Zugriff außerhalb von / Views speichern muss.
Antworten:
Der Code stammt von http://blogs.microsoft.co.il/blogs/shay/archive/2009/03/06/real-world-error-hadnling-in-asp-net-mvc-rc2.aspx und funktioniert auch in ASP.net MVC 1.0
So gehe ich mit http-Ausnahmen um:
quelle
Anforderungen an 404
Das Folgende sind meine Anforderungen für eine 404-Lösung und unten zeige ich, wie ich sie implementiere:
Lösung
Ich denke, Sie sollten
Application_Error
in der Global.asax für höhere Dinge wie nicht behandelte Ausnahmen und Protokollierung (wie Shay Jacobys Antwort zeigt) speichern, aber nicht für die 404-Behandlung. Aus diesem Grund hält mein Vorschlag das 404-Material aus der Global.asax-Datei heraus.Schritt 1: Haben Sie einen gemeinsamen Platz für die 404-Fehlerlogik
Dies ist eine gute Idee für die Wartbarkeit. Verwenden Sie einen ErrorController, damit sich zukünftige Verbesserungen an Ihrer gut gestalteten 404-Seite problemlos anpassen lassen. Auch stellen Sie sicher , Ihre Antwort hat den 404 - Code !
Schritt 2: Verwenden Sie eine Basis-Controller-Klasse, damit Sie Ihre benutzerdefinierte 404-Aktion einfach aufrufen und verkabeln können
HandleUnknownAction
404s in ASP.NET MVC müssen an mehreren Stellen abgefangen werden. Der erste ist
HandleUnknownAction
.Die
InvokeHttp404
Methode schafft einen gemeinsamen Ort für die Umleitung zurErrorController
und unserer neuenHttp404
Aktion. Denken Sie trocken !Schritt 3: Verwenden Sie Dependency Injection in Ihrer Controller Factory und verbinden Sie 404 HttpExceptions
So (es muss nicht StructureMap sein):
MVC1.0-Beispiel:
MVC2.0-Beispiel:
Ich denke, es ist besser, Fehler näher an ihrem Ursprungsort zu erkennen. Deshalb ziehe ich das Obige dem
Application_Error
Handler vor.Dies ist der zweite Ort, um 404s zu fangen.
Schritt 4: Fügen Sie Global.asax eine NotFound-Route für URLs hinzu, die nicht in Ihre App analysiert werden können
Diese Route sollte auf unser
Http404
Handeln hinweisen . Beachten Sie, dass derurl
Parameter eine relative URL ist, da die Routing-Engine den Domain-Teil hier entfernt? Deshalb haben wir in Schritt 1 all diese bedingte URL-Logik.Dies ist der dritte und letzte Ort, an dem Sie 404s in einer MVC-App abfangen können, die Sie nicht selbst aufrufen. Wenn Sie hier keine nicht übereinstimmenden Routen abfangen, leitet MVC das Problem an ASP.NET (Global.asax) weiter, und das möchten Sie in dieser Situation nicht wirklich.
Schritt 5: Rufen Sie abschließend 404s auf, wenn Ihre App etwas nicht finden kann
Zum Beispiel, wenn eine schlechte ID an meinen Loans Controller gesendet wird (abgeleitet von
MyController
):Es wäre schön, wenn all dies an weniger Stellen mit weniger Code verbunden werden könnte, aber ich denke, diese Lösung ist wartbarer, testbarer und ziemlich pragmatisch.
Vielen Dank für das bisherige Feedback. Ich würde gerne mehr bekommen.
HINWEIS: Dies wurde erheblich von meiner ursprünglichen Antwort geändert, aber der Zweck / die Anforderungen sind dieselben - aus diesem Grund habe ich keine neue Antwort hinzugefügt
quelle
customErrors
Abschnitt der Datei web.config definiert statische Umleitungsseiten, die in aspnet auf hoher Ebene behandelt werden, wenn nicht in IIS. Dies ist nicht das, was ich wollte, da ich das Ergebnis MVC Views haben musste (damit ich Daten darin haben kann usw.). Ich würde nicht kategorisch sagen, dass "customErrors
in MVC veraltet ist", aber für mich und diese 404-Lösung sind sie es mit Sicherheit.ObjectFactory.GetInstance
habeDependencyResolver.Current.GetService
stattdessen zu MVC3 gewechselt, damit es allgemeiner ist. Ich benutze Ninject.ASP.NET MVC unterstützt benutzerdefinierte 404-Seiten nicht sehr gut. Benutzerdefinierte Controller-Fabrik, Sammelroute, Basis-Controller-Klasse mit
HandleUnknownAction
- argh!Benutzerdefinierte IIS-Fehlerseiten sind bisher eine bessere Alternative:
web.config
ErrorController
Beispielprojekt
quelle
customErrors mode="On"
zusammen mit demHandleErrorAttribute
, um funktionsfähig zu sein. Benutzerdefinierte Fehlerseiten für nicht behandelte Ausnahmen in Controller-Aktionen werden nicht mehr bereitgestellt.Schnelle Antwort / TL; DR
Für die faulen Leute da draußen:
Entfernen Sie dann diese Zeile aus
global.asax
Dies gilt nur für IIS7 + und IIS Express.
Wenn Sie Cassini benutzen ... na ja ... ähm ... umständlich ...
Lange, erklärte Antwort
Ich weiß, dass dies beantwortet wurde. Aber die Antwort ist WIRKLICH EINFACH (Prost an David Fowler und Damian Edwards wirklich beantwortet haben).
Es ist nicht erforderlich, benutzerdefinierte Aktionen auszuführen .
Zum
ASP.NET MVC3
alle Kleinigkeiten sind da.Schritt 1 -> Aktualisieren Sie Ihre web.config an ZWEI Stellen.
und
Beachten Sie nun sorgfältig die ROUTEN, für die ich mich entschieden habe. Sie können alles verwenden, aber meine Routen sind
/NotFound
<- für eine 404 nicht gefunden, Fehlerseite./ServerError
<- Fügen Sie für jeden anderen Fehler Fehler hinzu, die in meinem Code auftreten. Dies ist ein 500 Internal Server ErrorSehen Sie, wie der erste Abschnitt in
<system.web>
nur einen benutzerdefinierten Eintrag enthält? DerstatusCode="404"
Eintrag? Ich habe nur einen Statuscode aufgelistet, da alle anderen Fehler, einschließlich des500 Server Error
(dh des lästigen Fehlers, der auftritt, wenn Ihr Code einen Fehler aufweist und die Benutzeranforderung abstürzt) .. alle anderen Fehler von der Einstellung behandelt werdendefaultRedirect="/ServerError"
.. die besagt Wenn Sie keine 404-Seite nicht gefunden haben, gehen Sie bitte zur Route/ServerError
.OK. das ist aus dem Weg .. jetzt zu meinen Routen in aufgeführt
global.asax
Schritt 2 - Erstellen der Routen in Global.asax
Hier ist mein vollständiger Streckenabschnitt.
Darin sind zwei Ignorierrouten aufgeführt ->
axd's
undfavicons
(ooo! Bonus-Ignorierroute für Sie!) Dann (und die Reihenfolge ist HIER IMPERATIV) habe ich meine zwei expliziten Fehlerbehandlungsrouten .. gefolgt von anderen Routen. In diesem Fall die Standardeinstellung. Natürlich habe ich mehr, aber das ist etwas Besonderes für meine Website. Stellen Sie einfach sicher, dass die Fehlerrouten ganz oben auf der Liste stehen. Ordnung ist unerlässlich .Während wir uns in unserer
global.asax
Datei befinden, registrieren wir das HandleError-Attribut NICHT global. Nein, nein, nein, Sir. Nadda. Nee. Nien. Negativ. Noooooooooo ...Entfernen Sie diese Zeile von
global.asax
Schritt 3 - Erstellen Sie den Controller mit den Aktionsmethoden
Nun ... fügen wir einen Controller mit zwei Aktionsmethoden hinzu ...
Ok, lass uns das überprüfen. Erstens gibt es hier KEIN
[HandleError]
Attribut. Warum? Weil das eingebaut istASP.NET
Framework bereits Fehler behandelt UND wir alle Dinge angegeben haben, die wir tun müssen, um einen Fehler zu behandeln :) Es ist in dieser Methode!Als nächstes habe ich die beiden Aktionsmethoden. Da ist nichts Schwieriges. Wenn Sie Ausnahmeinformationen anzeigen möchten, können
Server.GetLastError()
Sie diese Informationen abrufen.Bonus WTF: Ja, ich habe eine dritte Aktionsmethode entwickelt, um die Fehlerbehandlung zu testen.
Schritt 4 - Erstellen Sie die Ansichten
Und schließlich erstellen Sie zwei Ansichten. Setzen Sie sie für diesen Controller in die normale Ansicht.
Bonuskommentare
Application_Error(object sender, EventArgs e)
Und das, meine Freunde, sollte es sein.
Herzlichen Glückwunsch zum Lesen und ein Einhorn als Preis!
quelle
?aspxerrorpath=/er/not/found
in URLs haben möchten.Ich habe untersucht A LOT auf , wie man richtig verwalten 404s in MVC (speziell MVC3) , und dies, meiner Meinung nach ist die beste Lösung , die ich habe kommen mit:
In global.asax:
ErrorsController:
(Optional)
Erläuterung:
AFAIK, es gibt 6 verschiedene Fälle, in denen eine ASP.NET MVC3-App 404s generieren kann.
(Automatisch generiert von ASP.NET Framework :)
(1) Eine URL findet keine Übereinstimmung in der Routentabelle.
(Automatisch generiert von ASP.NET MVC Framework :)
(2) Eine URL findet eine Übereinstimmung in der Routentabelle, gibt jedoch einen nicht vorhandenen Controller an.
(3) Eine URL findet eine Übereinstimmung in der Routentabelle, gibt jedoch eine nicht vorhandene Aktion an.
(Manuell generiert :)
(4) Eine Aktion gibt ein HttpNotFoundResult mit der Methode HttpNotFound () zurück.
(5) Eine Aktion löst eine HttpException mit dem Statuscode 404 aus.
(6) Durch eine Aktion wird die Response.StatusCode-Eigenschaft manuell in 404 geändert.
Normalerweise möchten Sie drei Ziele erreichen:
(1) Zeigen Sie dem Benutzer eine benutzerdefinierte 404-Fehlerseite an.
(2) Pflegen Sie den 404-Statuscode in der Kundenantwort (besonders wichtig für SEO).
(3) Senden Sie die Antwort direkt, ohne dass eine 302-Umleitung erforderlich ist.
Es gibt verschiedene Möglichkeiten, dies zu erreichen:
(1)
Probleme mit dieser Lösung:
(2)
Probleme mit dieser Lösung:
(3)
Probleme mit dieser Lösung:
(4)
und
Probleme mit dieser Lösung:
Personen, die sich zuvor damit befasst haben, haben sogar versucht, ihre eigenen Bibliotheken zu erstellen (siehe http://aboutcode.net/2011/02/26/handling-not-found-with-asp-net-mvc3.html ). Die vorherige Lösung scheint jedoch alle Fälle abzudecken, ohne die Komplexität der Verwendung einer externen Bibliothek.
quelle
public ActionResult NotFound() {}
in deinem ErrorsController vergessen . Können Sie auch erklären, wie Ihr_NotFound
Teil für AJAX-Anfragen aussehen würde?MissingMethodException: Cannot create an abstract class
auf dem Laufenden.c.Execute(new RequestContext(new HttpContextWrapper(Context), rd));
Irgendwelche Ideen?Ich mag Cottsaks Lösung sehr und denke, es ist sehr klar erklärt. Meine einzige Ergänzung bestand darin, Schritt 2 wie folgt zu ändern
Grundsätzlich verhindert dies, dass URLs mit ungültigen Aktionen UND Controllern die Ausnahmeroutine zweimal auslösen. zB für URLs wie asdfsdf / dfgdfgd
quelle
Die einzige Möglichkeit, die Methode von @ cottsak für ungültige Controller zum Laufen zu bringen, bestand darin, die vorhandene Routenanforderung in der CustomControllerFactory wie folgt zu ändern:
Ich sollte erwähnen, dass ich MVC 2.0 verwende.
quelle
Hier ist eine andere Methode, die MVC-Tools verwendet, mit denen Sie Anforderungen an fehlerhafte Controllernamen, fehlerhafte Routennamen und andere Kriterien verarbeiten können, die in eine Aktionsmethode passen. Ich persönlich bevorzuge es, so viele web.config-Einstellungen wie möglich zu vermeiden, da sie die 302/200-Umleitung durchführen und ResponseRewrite nicht unterstützen (
Server.Transfer
) mit Razor-Ansichten . Ich würde aus SEO-Gründen lieber einen 404 mit einer benutzerdefinierten Fehlerseite zurückgeben.Einiges davon ist eine neue Version der obigen Technik von Cottsak.
Diese Lösung verwendet auch minimale web.config-Einstellungen, die stattdessen die MVC 3-Fehlerfilter bevorzugen.
Verwendungszweck
Wirf einfach eine HttpException aus einer Aktion oder einem benutzerdefinierten ActionFilterAttribute.
Schritt 1
Fügen Sie Ihrer web.config die folgende Einstellung hinzu. Dies ist erforderlich, um das HandleErrorAttribute von MVC zu verwenden.
Schritt 2
Fügen Sie ein benutzerdefiniertes HandleHttpErrorAttribute hinzu, das dem HandleErrorAttribute des MVC-Frameworks ähnelt, mit Ausnahme von HTTP-Fehlern:
Schritt 3
Fügen Sie der GlobalFilterCollection (
GlobalFilters.Filters
) in Filter hinzuGlobal.asax
. In diesem Beispiel werden alle InternalServerError (500) -Fehler an die gemeinsam genutzte Fehleransicht (Views/Shared/Error.vbhtml
) weitergeleitet. NotFound (404) -Fehler werden auch in den freigegebenen Ansichten an ErrorHttp404.vbhtml gesendet. Ich habe hier einen 401-Fehler hinzugefügt, um Ihnen zu zeigen, wie dieser für zusätzliche HTTP-Fehlercodes erweitert werden kann. Beachten Sie, dass dies gemeinsam genutzte Ansichten sein müssen und alle dasSystem.Web.Mvc.HandleErrorInfo
Objekt als Modell verwenden.Schritt 4
Erstellen Sie eine Basis-Controller-Klasse und erben Sie diese in Ihren Controllern. Dieser Schritt ermöglicht es uns, unbekannte Aktionsnamen zu behandeln und den HTTP 404-Fehler auf unser HandleHttpErrorAttribute zu setzen.
Schritt 5
Erstellen Sie eine ControllerFactory-Überschreibung und überschreiben Sie sie in Ihrer Global.asax-Datei in Application_Start. Mit diesem Schritt können wir die HTTP 404-Ausnahme auslösen, wenn ein ungültiger Controllername angegeben wurde.
Schritt 6
Fügen Sie eine spezielle Route in Ihre RoutTable ein. Routen für die Aktion "BaseController unbekannt". Dies hilft uns, einen 404 auszulösen, wenn ein Benutzer auf einen unbekannten Controller oder eine unbekannte Aktion zugreift.
Zusammenfassung
In diesem Beispiel wurde gezeigt, wie mit dem MVC-Framework 404 HTTP-Fehlercodes ohne Umleitung mithilfe von Filterattributen und freigegebenen Fehleransichten an den Browser zurückgegeben werden können. Es wird auch gezeigt, dass dieselbe benutzerdefinierte Fehlerseite angezeigt wird, wenn ungültige Controllernamen und Aktionsnamen angegeben werden.
Ich werde einen Screenshot eines ungültigen Controllernamens, eines Aktionsnamens und eines benutzerdefinierten 404 hinzufügen, der aus der Aktion Home / TriggerNotFound ausgelöst wurde, wenn ich genügend Stimmen bekomme, um eine zu posten =). Fiddler gibt eine 404-Nachricht zurück, wenn ich mit dieser Lösung auf die folgenden URLs zugreife:
cottsaks Beitrag oben und diese Artikel waren gute Referenzen.
quelle
The IControllerFactory 'aaa.bbb.CustomControllerFactory' did not return a controller for the name '123'.
- Irgendwelche Ideen, warum ich das bekommen würde?Meine verkürzte Lösung, die mit nicht behandelten Bereichen, Controllern und Aktionen funktioniert:
Erstellen Sie eine Ansicht 404.cshtml.
Erstellen Sie eine Basisklasse für Ihre Controller:
Erstellen Sie eine benutzerdefinierte Controller-Factory, die Ihren Basis-Controller als Fallback zurückgibt:
Fügen Sie
Application_Start()
der folgenden Zeile hinzu:quelle
In MVC4 kann WebAPI 404 folgendermaßen behandelt werden:
KURSE APICONTROLLER
HOME CONTROLLER
AUSSICHT
GLOBAL
ERGEBNISSE
quelle
Versuchen Sie NotFoundMVC auf Nuget. Es funktioniert, kein Setup.
quelle
http://localhost/Views/Shared/NotFound.cshtml
führt nicht zu einer benutzerdefinierten 404-Seite.Meine Lösung für den Fall, dass jemand sie nützlich findet.
In Web.config:
In
Controllers/ErrorController.cs
:Fügen Sie ein
PageNotFound.cshtml
in denShared
Ordner, und das war's.quelle
model.RequestedUrl = Request.Url.OriginalString.Contains(url) & Request.Url.OriginalString != url ? Request.Url.OriginalString : url;
und nichtmodel.RequestedUrl = Request.Url.OriginalString.Contains(url) && Request.Url.OriginalString != url ? Request.Url.OriginalString : url;
(& anstelle von &&)?Es scheint mir , dass die Standard -
CustomErrors
Konfiguration soll nur arbeiten jedoch aufgrund der Abhängigkeit von derServer.Transfer
es scheint , dass die interne Umsetzung derResponseRewrite
nicht kompatibel mit MVC ist.Dies fühlt sich für mich wie eine eklatante Funktionslücke an, daher habe ich beschlossen, diese Funktion mithilfe eines HTTP-Moduls erneut zu implementieren. Mit der folgenden Lösung können Sie jeden HTTP-Statuscode (einschließlich 404) verarbeiten, indem Sie wie gewohnt zu einer gültigen MVC-Route umleiten.
Dies wurde auf den folgenden Plattformen getestet.
Leistungen
Die Lösung
Verwendungszweck
Fügen Sie dies als letztes HTTP-Modul in Ihre web.config ein
Wenn Sie aufpassen, werden Sie feststellen, dass dies im integrierten Pipeline-Modus aufgrund der Funktionsweise immer mit HTTP 200 reagiert
Server.TransferRequest
. Um den richtigen Fehlercode zurückzugeben, verwende ich den folgenden Fehlercontroller.quelle
Der Umgang mit Fehlern in ASP.NET MVC ist nur ein Problem. Ich habe viele Vorschläge auf dieser Seite und auf anderen Fragen und Websites ausprobiert und nichts funktioniert gut. Ein Vorschlag war, Fehler in web.config in system.webserver zu behandeln, die jedoch nur leere Seiten zurückgeben .
Mein Ziel bei der Entwicklung dieser Lösung war:
Hier ist meine Lösung.
1. Fügen Sie dem Abschnitt system.web Folgendes hinzu
Im obigen Abschnitt werden alle URLs behandelt, die nicht von route.config behandelt werden, sowie nicht behandelte Ausnahmen, insbesondere solche, die in den Ansichten auftreten. Beachten Sie, dass ich aspx nicht html verwendet habe . Auf diese Weise kann ich dem Code dahinter einen Antwortcode hinzufügen .
2 . Erstellen Sie im Stammverzeichnis Ihres Projekts einen Ordner mit dem Namen " Fehler" (oder was auch immer Sie bevorzugen) und fügen Sie die beiden Webformulare hinzu. Unten ist meine 404 Seite;
Und auf dem Code dahinter habe ich den Antwortcode festgelegt
Machen Sie dasselbe für die 500-Seite
3. Um Fehler in den Controllern zu behandeln. Es gibt viele Möglichkeiten, dies zu tun. Das hat bei mir funktioniert. Alle meine Controller erben von einem Basis-Controller. Im Basis-Controller habe ich die folgenden Methoden
4 .Add die CustomError.cshtml auf Ihre freigegebenen Ordner Sichten. Unten ist meins;
Jetzt können Sie in Ihrem Anwendungscontroller so etwas tun.
Nun zum Vorbehalt . Statische Dateifehler werden nicht behandelt. Wenn Sie also eine Route wie example.com/widgets haben und der Benutzer diese in example.com/widgets.html ändert , wird die IIS-Standardfehlerseite angezeigt, sodass Sie Fehler auf IIS-Ebene auf andere Weise behandeln müssen.
quelle
Eine Antwort posten, da mein Kommentar zu lang war ...
Es ist sowohl ein Kommentar als auch eine Frage zum Einhorn-Beitrag / zur Antwort:
https://stackoverflow.com/a/7499406/687549
Ich bevorzuge diese Antwort gegenüber den anderen, weil sie einfach ist und anscheinend einige Leute bei Microsoft konsultiert wurden. Ich habe jedoch drei Fragen und wenn sie beantwortet werden können, werde ich diese Antwort den heiligen Gral aller 404/500 Fehlerantworten in den Interwebs für eine ASP.NET MVC (x) -App nennen.
@ Pure.Krome
Können Sie Ihre Antwort mit dem SEO-Material aus den Kommentaren von GWB aktualisieren (dies wurde in Ihrer Antwort nie erwähnt) -
<customErrors mode="On" redirectMode="ResponseRewrite">
und<httpErrors errorMode="Custom" existingResponse="Replace">
?Können Sie Ihre ASP.NET-Teamfreunde fragen, ob es in Ordnung ist, dies so zu tun - wäre schön, eine Bestätigung zu haben - vielleicht ist es ein großes Nein-Nein, sich zu ändern
redirectMode
undexistingResponse
auf diese Weise in der Lage zu sein, gut mit SEO zu spielen?!Können Sie einige Klärung rund um das ganze Zeug (addieren
customErrors redirectMode="ResponseRewrite"
,customErrors redirectMode="ResponseRedirect"
,httpErrors errorMode="Custom" existingResponse="Replace"
, REMOVEcustomErrors
VOLLSTÄNDIG als jemand vorschlug) nach dem Gespräch mit Ihren Freunden bei Microsoft?Wie ich sagte; Es wäre überragend, wenn wir Ihre Antwort vollständiger machen könnten, da dies eine ziemlich beliebte Frage mit mehr als 54 000 Ansichten zu sein scheint.
Update : Die Antwort von Unicorn führt zu 302 Found und 200 OK und kann nicht geändert werden, um nur 404 über eine Route zurückzugeben. Es muss eine physische Datei sein, die nicht sehr MVC: ish ist. Fahren Sie also mit einer anderen Lösung fort. Schade, denn dies schien die ultimative MVC zu sein: ish Antwort bis jetzt.
quelle
Hinzufügen meiner Lösung, die fast identisch mit der von Herman Kan ist, mit einer kleinen Falte, damit sie für mein Projekt funktioniert.
Erstellen Sie einen benutzerdefinierten Fehlercontroller:
Erstellen Sie dann eine benutzerdefinierte Controller-Factory:
Fügen Sie abschließend dem benutzerdefinierten Fehlercontroller eine Überschreibung hinzu:
Und das ist es. Web.config muss nicht geändert werden.
quelle
1) Machen Sie eine abstrakte Controller-Klasse.
2) Vererbung dieser abstrakten Klasse in allen Controllern
3) Fügen Sie in Ihrem View-Shared-Ordner eine Ansicht mit dem Namen "NotFound" hinzu.
quelle
Ich habe die meisten in diesem Thread veröffentlichten Lösungen durchgesehen. Obwohl diese Frage alt sein mag, ist sie auch jetzt noch für neue Projekte sehr zutreffend. Daher habe ich viel Zeit damit verbracht, die hier und anderswo gestellten Antworten zu lesen.
Als @Marco auf die verschiedenen Fälle hinwies, in denen ein 404 auftreten kann, überprüfte ich die Lösung, die ich zusammengestellt hatte, anhand dieser Liste. Zusätzlich zu seiner Liste der Anforderungen habe ich noch eine hinzugefügt.
Diese Lösung ist zweifach:
Der erste Teil stammt von @Guillaume unter https://stackoverflow.com/a/27354140/2310818 . Ihre Lösung kümmert sich um alle 404, die aufgrund einer ungültigen Route, eines ungültigen Controllers und einer ungültigen Aktion verursacht wurden.
Die Idee ist, ein WebForm zu erstellen und es dann die NotFound-Aktion Ihres MVC Errors Controllers aufrufen zu lassen. Dies alles ohne Umleitung, sodass Sie in Fiddler keine einzige 302 sehen. Die ursprüngliche URL bleibt ebenfalls erhalten, was diese Lösung fantastisch macht!
Der zweite Teil stammt von @ Germán unter https://stackoverflow.com/a/5536676/2310818 . Ihre Lösung kümmert sich um alle 404, die von Ihren Aktionen in Form von HttpNotFoundResult () zurückgegeben werden, oder löst eine neue HttpException () aus!
Die Idee ist, einen Filter-Blick auf die Antwort sowie die von Ihren MVC-Controllern ausgelöste Ausnahme zu werfen und die entsprechende Aktion in Ihrem Fehler-Controller aufzurufen. Auch diese Lösung funktioniert ohne Weiterleitung und die ursprüngliche URL bleibt erhalten!
Wie Sie sehen können, bieten beide Lösungen zusammen einen sehr robusten Mechanismus zur Fehlerbehandlung und erfüllen alle von @Marco aufgeführten Anforderungen sowie meine Anforderungen. Wenn Sie ein funktionierendes Beispiel oder eine Demo dieser Lösung sehen möchten, hinterlassen Sie bitte in den Kommentaren und ich würde es gerne zusammenstellen.
quelle
Ich habe alle Artikel durchgesehen, aber nichts funktioniert für mich: Mein Anforderungsbenutzer gibt etwas in Ihre URL ein. Die benutzerdefinierte 404-Seite sollte angezeigt werden. Ich dachte, es ist sehr einfach. Aber Sie sollten den Umgang mit 404 richtig verstehen:
Ich fand diesen Artikel sehr hilfreich. Sollte sofort gelesen werden. Kundenspezifische Fehlerseite - Ben Foster
quelle