У меня чертовски много времени выясняется, как правильно реализовать перенаправление 404.
Если я использую следующее
<HandleError()> _
Public Class BaseController : Inherits System.Web.Mvc.Controller
''# do stuff
End Class
Тогда любая необработанная ошибка на странице загрузит представление «Ошибка», которое прекрасно работает. http://example.com/user/999 (где 999 - недопустимый идентификатор пользователя) выдаст ошибку при сохранении исходного URL (это то, что я хочу)
Тем не менее. Если кто-то вводит http://example.com/asdfjkl в URL (где asdfjkl - недопустимый контроллер), то IIS создает общую страницу 404. (это не , что я хочу). То, что мне нужно, это то же самое, что и выше. Исходный URL остается, а контроллер NotFound загружается.
Я регистрирую свои маршруты следующим образом
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
Обратите внимание на ControllerExistsConstraint
? Что мне нужно сделать, это использовать Reflection, чтобы узнать, существует ли контроллер.
Кто-нибудь может мне помочь заполнить пробелы?
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
Я также хотел бы знать, как это влияет на производительность ... насколько тяжелым является Reflection? Если это слишком много, есть ли лучший способ?