为了支持我的应用中的旧版网址,我使用正则表达式将/Repo/{ixRepo}/{sSlug}/{sAction}
形式的网址转换为新表单/Repo/{sName}/{sAction}
,使用ixRepo
获取正确的{{1} }}。这很好用,我可以使用RedirectResult将用户重定向到新的URL。
但是,我想在重定向用户之前捕获带有无效操作的旧URL。如何验证URL字符串是否映射到已注册的路由? MVC明确地在内部将请求映射到正确的操作,但我想手动完成。
到目前为止,我已经想出了这个:
sName
似乎总是返回var rd = Url.RouteCollection.GetRouteData(new HttpContextWrapper(new HttpContext(
new HttpRequest("", newPath, ""),
new HttpResponse(null))));
,即使是错误的路线也是如此。我找不到一种方法来检查路由是否被接受为全部捕获,或者是否实际映射到在控制器上注册的路由。
如何使用MVC的路由系统检查URL是否通过注册路由映射到有效的控制器/操作?
(我见过ASP.NET MVC - Verify the Existence of a Route,但这真的很不优雅.MVC内置了一个路由系统,我想用它。)
答案 0 :(得分:3)
错误的问题。 Anything 可以是一条路线,无论它是否实际映射到一个动作。
我想你在问,“这会执行正常,还是404?”这是一个不同的问题。
为此,你需要做MVC所做的事情。查看MVC源代码MvcHandler.ProcessRequestInit
然后ControllerActionInvoker.InvokeAction
以查看MVC如何分别查找控制器和操作。
答案 1 :(得分:1)
如果您了解控制器并要求采取有效措施,请执行here中的反思操作。
如果重定向的网址转到您的应用程序,那么您可以检查网址是否转到有效路由。 haacked.com http://haacked.com/archive/2007/12/17/testing-routes-in-asp.net-mvc.aspx上的一些代码将测试路由为单元测试。在此之后你有控制器和动作作为routedata你必须做,克雷格说“做与mvc一样的事。”。 路由系统将请求uris映射到路由处理程序。如果mvc路由处理程序(类)失败,则抛出异常。没有检查。
您可以为路线添加约束。如果约束action属性。然后检查网址是否进入有效路径我是你想要的。