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.