12 Stimmen

ASP.NET MVC - Wie man eine 404-Seite wirft, ähnlich der auf StackOverflow

Ich habe derzeit eine BaseController-Klasse, die von System.Web.Mvc.Controller erbt. In dieser Klasse habe ich das HandleError-Attribut, das Benutzer auf die Seite "500 - Oops, wir haben Mist gebaut" umleitet. Dies funktioniert derzeit wie erwartet.

DAS FUNKTIONIERT

 _
Public Class BaseController : Inherits System.Web.Mvc.Controller

''# etwas tun
End Class

Auch meine 404-Seiten funktionieren auf Basis von Per-ActionResult, was auch wie erwartet funktioniert.

DAS FUNKTIONIERT

    Function Details(ByVal id As Integer) As ActionResult
        Dim user As Domain.User = UserService.GetUserByID(id)

        If Not user Is Nothing Then
            Dim userviewmodel As Domain.UserViewModel = New Domain.UserViewModel(user)
            Return View(userviewmodel)
        Else
            ''# Aufgrund von RESTful-URLs möchten einige Leute "herumstöbern",
            ''# indem sie Nummern in die Adresse eingeben. Wir müssen sie
            ''# sanft auf eine nicht gefundene Seite umleiten, wenn der Benutzer nicht
            ''# existiert.
            Response.StatusCode = CInt(HttpStatusCode.NotFound)
            Return View("NotFound")
        End If

    End Function

Auch dies funktioniert großartig. Wenn ein Benutzer z.B. etwas wie http://example.com/user/999 eingibt (wobei die Benutzer-ID 999 nicht existiert), sehen sie die entsprechende 404-Seite, und dennoch ändert sich die URL nicht (sie werden nicht auf eine Fehlerseite umgeleitet).

ICH KANN DIESE IDEE NICHT ZUM LAUFEN BRINGEN

Hier habe ich ein Problem. Wenn ein Benutzer z.B. http://example.com/asdf- eingibt, werden sie zur generischen 404-Seite weitergeleitet. Was ich tun möchte, ist die URL intakt zu lassen (d.h. keine Umleitung auf eine andere Seite), sondern einfach die "NotFound"-Ansicht anzuzeigen und das HttpStatusCode.NotFound an den Client zu senden.

Zum Beispiel besuchen Sie einfach https://stackoverflow.com/asdf, wo Sie die benutzerdefinierte 404-Seite sehen und die URL intakt lassen.

Offensichtlich fehlt mir etwas, aber ich kann es nicht herausfinden. Da "asdf" nicht tatsächlich auf einen Controller verweist, wird meine Basisklassen-Controller-Klasse nicht aktiviert, sodass ich es nicht im "HandleError"-Filter dort tun kann.

Vielen Dank im Voraus für die Hilfe.

Hinweis: Ich möchte den Benutzer auf keinen Fall auf eine 404-Seite umleiten. Ich möchte, dass sie unter der aktuellen URL bleiben und dass MVC die 404-ANSICHT an den Benutzer sendet.

Bearbeiten:

Ich habe auch Folgendes erfolglos versucht.

Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
    routes.RouteExistingFiles = False
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
    routes.IgnoreRoute("Assets/{*pathInfo}")
    routes.IgnoreRoute("{*robotstxt}", New With {.robotstxt = "(.*/)?robots.txt(/.*)?"})

    routes.AddCombresRoute("Combres")

    ''# MapRoute ermöglicht eine dynamische UserDetails-ID
    routes.MapRouteLowercase("UserProfile", _
        "Users/{id}/{slug}", _
        New With {.controller = "Users", .action = "Details", .slug = UrlParameter.Optional}, _
        New With {.id = "\d+"} _
    )

    ''# Standard Catch All Gültige Routen
    routes.MapRouteLowercase( _
        "Standard", _
        "{controller}/{action}/{id}/{slug}", _
        New With {.controller = "Events", .action = "Index", .id = UrlParameter.Optional, .slug = UrlParameter.Optional} _
    )

    ''# Fangen Sie alle ungültigen (Nicht gefundenen) Routen ab
    routes.MapRoute( _
        "NotFound", _
        "{*url}", _
        New With {.controller = "Error", .action = "NotFound"})

End Sub

Meine "NotFound"-Route tut nichts.

0voto

user403579 Punkte 61

Es ist ein großes Versäumnis des ASP.NET MVC-Frameworks, weil Sie (echte Anpassung meine ich nicht nur eine Fehlerseite für alles) 404-Seiten ohne "Krücken" wie 1 Antwort nicht anpassen können. Sie können einen 404-Fehler für alle nicht gefundenen Ursachen verwenden, oder Sie können mehrere 500-Fehlerseiten über [HandleError] anpassen, aber Sie KÖNNEN 404-Fehler nicht deklarativ anpassen. 500 Fehler sind aus SEO-Gründen schlecht. 404 Fehler sind gute Fehler.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X