Me está costando mucho tiempo encontrar la manera de implementar correctamente mi redireccionamiento 404.ASP.NET MVC - Use Reflection para encontrar si existe un controlador
Si utilizo el siguiente
<HandleError()> _
Public Class BaseController : Inherits System.Web.Mvc.Controller
''# do stuff
End Class
Entonces, cualquier error no controlado en la página se carga hasta la vista "error", que funciona muy bien. http://example.com/user/999 (donde 999 es un usuario no válido de identificación) generará un error mientras se mantiene la URL original (esto es lo que quiero)
Sin embargo. Si alguien ingresa http://example.com/asdfjkl en la url (donde asdfjkl es un controlador inválido), entonces IIS lanza la página 404 genérica. (esto es no lo que quiero). Lo que necesito es lo mismo que se aplica arriba. La URL original permanece y se carga el controlador "NotFound".
estoy registrar mis rutas como esta
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
Aviso del ControllerExistsConstraint
? Lo que tengo que hacer es usar Reflection para descubrir si existe o no un controlador.
¿Alguien me puede ayudar a llenar los espacios en blanco?
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
También me gustaría saber las implicaciones de rendimiento de este ... cómo el rendimiento es pesado ¿Reflexión? Si es demasiado, ¿hay una mejor manera?
porque en mi pregunta dije "La URL original permanece, y el controlador" NotFound "está cargado.". ** NO deseo redireccionar a una página no encontrada ** –