验证URL是否映射到ASP.Net MVC中的实际路由

时间:2010-09-02 14:20:04

标签: asp.net-mvc

为了支持我的应用中的旧版网址,我使用正则表达式将/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内置了一个路由系统,我想用它。)

2 个答案:

答案 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属性。然后检查网址是否进入有效路径我是你想要的。