Wenn die Route angegeben ist:
{FeedName} / {ItemPermalink}
Beispiel: / Blog / Hello-World
Wenn das Element nicht vorhanden ist, möchte ich eine 404 zurückgeben. Wie gehe ich in ASP.NET MVC richtig vor?
asp.net
asp.net-mvc
http-status-code-404
Daniel Schaffer
quelle
quelle
Antworten:
Wenn ich aus der Hüfte schieße (Cowboy-Codierung ;-)), würde ich so etwas vorschlagen:
Regler:
HttpNotFoundResult:
Mit diesem Ansatz halten Sie sich an die Framework-Standards. Es gibt bereits ein HttpUnauthorizedResult, sodass dies das Framework in den Augen eines anderen Entwicklers erweitern würde, der Ihren Code später verwaltet (Sie wissen, der Psycho, der weiß, wo Sie leben).
Sie könnten einen Reflektor verwenden, um einen Blick in die Baugruppe zu werfen und zu sehen, wie das HttpUnauthorizedResult erreicht wird, da ich nicht weiß, ob bei diesem Ansatz etwas fehlt (es scheint fast zu einfach).
Ich habe gerade einen Reflektor verwendet, um mir das HttpUnauthorizedResult anzusehen. Anscheinend setzen sie den StatusCode für die Antwort auf 0x191 (401). Obwohl dies für 401 funktioniert, scheint es, wenn ich 404 als neuen Wert verwende, in Firefox nur eine leere Seite zu bekommen. Internet Explorer zeigt jedoch einen Standardwert von 404 an (nicht die ASP.NET-Version). Mit der Webentwickler-Symbolleiste habe ich die Header in FF überprüft, die eine 404 Not Found-Antwort anzeigen. Könnte einfach etwas sein, das ich in FF falsch konfiguriert habe.
Trotzdem denke ich, dass Jeffs Ansatz ein gutes Beispiel für KISS ist. Wenn Sie die Ausführlichkeit in diesem Beispiel nicht wirklich benötigen, funktioniert seine Methode ebenfalls einwandfrei.
quelle
Wir machen es so; Dieser Code befindet sich in
BaseController
so genannt
quelle
quelle
web.config
.Das HttpNotFoundResult ist ein großartiger erster Schritt zu dem, was ich verwende. Die Rückgabe eines HttpNotFoundResult ist gut. Dann ist die Frage, was kommt als nächstes?
Ich habe einen Aktionsfilter namens HandleNotFoundAttribute erstellt, der dann eine 404-Fehlerseite anzeigt. Da eine Ansicht zurückgegeben wird, können Sie pro Controller eine spezielle 404-Ansicht erstellen oder eine gemeinsam genutzte Standard-404-Ansicht verwenden. Dies wird sogar aufgerufen, wenn auf einem Controller die angegebene Aktion nicht vorhanden ist, da das Framework eine HttpException mit dem Statuscode 404 auslöst.
quelle
Beachten Sie, dass Sie ab MVC3 nur noch verwenden können
HttpStatusCodeResult
.quelle
HttpNotFoundResult
Die Verwendung von ActionFilter ist schwierig zu warten, da bei jedem Fehler der Filter im Attribut festgelegt werden muss. Was ist, wenn wir vergessen, es einzustellen? Eine Möglichkeit besteht darin, den
OnException
Basis-Controller abzuleiten . Sie müssen eineBaseController
Ableitung von definierenController
und alle Ihre Controller müssen von abgeleitet seinBaseController
. Es wird empfohlen, einen Basis-Controller zu haben.Beachten Sie, dass bei Verwendung
Exception
des Antwortstatuscodes 500 für Nicht gefunden in 404 und für Nicht autorisiert in 401 geändert werden muss. Verwenden Sie, wie oben erwähnt,OnException
Overrides fürBaseController
, um die zu vermeiden.Die neue MVC 3 macht es auch schwieriger, wenn eine leere Ansicht an den Browser zurückgegeben wird. Die beste Lösung nach einigen Recherchen basiert auf meiner Antwort hier Wie kann eine Ansicht für HttpNotFound () in ASP.Net MVC 3 zurückgeben?
Um mehr Komfort zu schaffen, füge ich es hier ein:
Nach einigem Studium. Die Abhilfe für MVC 3 hier ist alles abzuleiten
HttpNotFoundResult
,HttpUnauthorizedResult
,HttpStatusCodeResult
Klassen und implementieren neuen (überschreibt es)HttpNotFound
() -Methode inBaseController
.Es wird empfohlen, den Basis-Controller zu verwenden, damit Sie die Kontrolle über alle abgeleiteten Controller haben.
Ich erstelle eine neue
HttpStatusCodeResult
Klasse, nicht um sie abzuleiten,ActionResult
sondernViewResult
um die Ansicht oder eine beliebige zu rendern,View
indem Sie dieViewName
Eigenschaft angeben . Ich folge dem OriginalHttpStatusCodeResult
, um das einzustellenHttpContext.Response.StatusCode
und werdeHttpContext.Response.StatusDescription
dannbase.ExecuteResult(context)
aber die passende Ansicht rendern, da ich wieder davon ableiteViewResult
. Einfach genug ist es? Hoffe, dass dies im MVC-Kern implementiert wird.Siehe meinen
BaseController
Balg:So verwenden Sie Ihre Aktion:
Und in _Layout.cshtml (wie Masterseite)
Zusätzlich können Sie eine benutzerdefinierte Ansicht wie verwenden
Error.shtml
oder eine neue erstellen,NotFound.cshtml
wie ich sie im Code kommentiert habe, und Sie können ein Ansichtsmodell für die Statusbeschreibung und andere Erklärungen definieren.quelle