Mam trochę czasu, zastanawiając się, jak poprawnie wdrożyć moje przekierowanie 404.ASP.NET MVC - Użyj refleksji, aby dowiedzieć się, czy istnieje sterownik
Jeśli używam następujący
<HandleError()> _
Public Class BaseController : Inherits System.Web.Mvc.Controller
''# do stuff
End Class
wtedy każdy nieobsługiwany błąd na stronie załaduje się na „Error” widok, który działa świetnie. http://example.com/user/999 (gdzie 999 jest nieprawidłowym identyfikatorem użytkownika) spowoduje wyświetlenie błędu przy zachowaniu oryginalnego adresu URL (tego właśnie chcę).
Jednak. Jeśli ktoś wpisze http://example.com/asdfjkl w adres URL (gdzie asdfjkl jest nieprawidłowym kontrolerem), to IIS rzuca ogólną stronę 404. (to jest nie czego chcę). Potrzebuję tego samego, aby zastosować powyższe. Oryginalny adres URL pozostaje, a kontroler "NotFound" jest załadowany.
mam rejestrację moich trasy jak to
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
obwieszczeniu ControllerExistsConstraint
? Muszę użyć Odbicia, aby odkryć, czy kontroler istnieje, czy nie.
Czy ktoś może mi pomóc wypełnić puste miejsca?
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
Chciałbym również poznać konsekwencje tego ... jak wysoka jest wydajność Reflection? Jeśli to za dużo, czy istnieje lepszy sposób?
ponieważ w moim pytaniu powiedziałem: "Pierwotny URL zostaje, a kontroler" NotFound "jest załadowany.". ** NIE chcę przekierowywać do strony nie znalezionej ** –