Я часто вижу, что сталкиваюсь со следующей проблемой. У меня есть некоторый интерфейс Marker Interface (для простоты давайте используем java.io.Serializable
) и несколько оболочек (Adapter, Decorator, Proxy, ...). Но когда вы оборачиваете экземпляр Serializable в другой экземпляр (который не сериализуем), вы теряете функциональность. Та же проблема возникает с java.util.RandomAccess, который может быть реализован реализациями List. NET MVC - используйте Reflection, чтобы найти, существует ли контроллер У меня чертовски много времени выясняется, как правильно реализовать перенаправление 404. Если я использую следующее
У меня чертовски много времени выясняется, как правильно реализовать перенаправление 404.
Если я использую следующее
_
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 загружается.
I ' m регистрировать мои маршруты следующим образом
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
Я также хотел бы знать, как это влияет на производительность ... как производительность тяжелое отражение? Если это слишком много, есть ли лучший способ?