Ho un po 'di tempo per capire come implementare correttamente il mio reindirizzamento 404.ASP.NET MVC - Usa Reflection per trovare se esiste un controller
Se uso il seguente
<HandleError()> _
Public Class BaseController : Inherits System.Web.Mvc.Controller
''# do stuff
End Class
Poi ogni errore non gestito sulla pagina verrà caricata la "Error" Vista che funziona alla grande. http://example.com/user/999 (dove 999 è un ID utente non valido) genererà un errore mantenendo l'URL originale (questo è quello che voglio)
Tuttavia. Se qualcuno immette http://example.com/asdfjkl nell'URL (dove asdfjkl è un controller non valido), IIS sta lanciando la pagina 404 generica. (questo è non quello che voglio). Quello di cui ho bisogno è che la stessa cosa sopra sia applicata. L'URL originale rimane e viene caricato il controller "NotFound".
sto registrando miei percorsi come questo
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")
routes.MapRoute("Start", "", New With {.controller = "Events", .action = "Index"})
''# MapRoute allows for a dynamic UserDetails ID
routes.MapRouteLowercase("UserProfile", "Users/{id}/{slug}", _
New With {.controller = "Users", .action = "Details", .slug = UrlParameter.Optional}, _
New With {.id = "\d+"} _
)
''# Default Catch All MapRoute
routes.MapRouteLowercase("Default", "{controller}/{action}/{id}/{slug}", _
New With {.controller = "Events", .action = "Index", .id = UrlParameter.Optional, .slug = UrlParameter.Optional}, _
New With {.controller = New ControllerExistsConstraint})
''# Catch everything else cuz they're 404 errors
routes.MapRoute("CatchAll", "{*catchall}", _
New With {.Controller = "Error", .Action = "NotFound"})
End Sub
Avviso il ControllerExistsConstraint
? Quello che devo fare è usare Reflection per scoprire se esiste o meno un controller.
Qualcuno può aiutarmi a compilare gli spazi vuoti?
Public Class ControllerExistsConstraint : Implements IRouteConstraint
Public Sub New()
End Sub
Public Function Match(ByVal httpContext As System.Web.HttpContextBase, ByVal route As System.Web.Routing.Route, ByVal parameterName As String, ByVal values As System.Web.Routing.RouteValueDictionary, ByVal routeDirection As System.Web.Routing.RouteDirection) As Boolean Implements System.Web.Routing.IRouteConstraint.Match
''# Bah, I can't figure out how to find if the controller exists
End Class
Vorrei anche conoscere le implicazioni sulle prestazioni di questa ... come pesante performance è la riflessione? Se è troppo, c'è un modo migliore?
perché nella mia domanda ho detto "L'URL originale rimane e il controller" NotFound "è caricato.". ** NON desidero reindirizzare a una pagina non trovata ** –