【问题标题】:Verify that a URL maps to an actual route in ASP.Net MVC验证 URL 是否映射到 ASP.Net MVC 中的实际路由
【发布时间】:2010-09-02 14:20:03
【问题描述】:

为了在我的应用程序中支持旧版 URL,我使用正则表达式将 /Repo/{ixRepo}/{sSlug}/{sAction} 形式的 URL 转换为新形式 /Repo/{sName}/{sAction},使用 ixRepo 来获得正确的 sName。这很好用,我可以使用 RedirectResult 将用户重定向到新 URL。

但是,我想在重定向用户之前捕获具有无效操作的旧 URL。如何验证 URL 字符串是否会映射到已注册的路由? MVC 显然在内部这样做是为了将请求映射到正确的操作,但我想手动完成。

到目前为止,我想出了这个:

var rd = Url.RouteCollection.GetRouteData(new HttpContextWrapper(new HttpContext(
    new HttpRequest("", newPath, ""),
    new HttpResponse(null))));

它似乎总是返回一个System.Web.Routing.RouteData,即使是糟糕的路线。我找不到方法来检查路由是否被接受为包罗万象,或者是否实际映射到控制器上注册的路由。

如何使用 MVC 的路由系统检查 URL 是否通过已注册的路由映射到有效的控制器/操作?

(我见过ASP.NET MVC - Verify the Existence of a Route,但这真的很不雅。MVC 内置了一个路由系统,我想使用它。)

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    错误的问题。 任何东西都可以是一个路由,不管它是否真的映射到一个动作。

    认为你在问,“这会执行正常,还是 404?”那是一个不同的问题。

    为此,您需要做 MVC 所做的事情。查看 MvcHandler.ProcessRequestInitControllerActionInvoker.InvokeAction 的 MVC 源代码,了解 MVC 如何分别查找控制器和操作。

    【讨论】:

      【解决方案2】:

      如果您了解控制器并要求执行有效操作,只需像 here 中那样做一些反射工作。

      如果重定向的 url 转到您的应用程序,那么您可以检查该 url 是否转到有效路由。 haacked.com http://haacked.com/archive/2007/12/17/testing-routes-in-asp.net-mvc.aspx 上的一些代码将路由测试作为单元测试。在此之后,您将控制器和操作作为路由数据,您必须执行 Craig 所说的“与 mvc 一样”。
      路由系统将请求 uri 映射到路由处理程序。如果失败,mvc 路由处理程序(类)会抛出异常。没有检查。

      您可以为您的路线添加约束。如果你约束 action 属性。然后检查 url 是否转到我想要的有效路线。

      【讨论】:

      • 另一个答案中链接的代码仅检查 action 令牌是否正常,而不是整个路由值集(例如,id)。
      猜你喜欢
      • 2010-09-05
      • 1970-01-01
      • 2015-12-26
      • 2010-12-09
      • 2011-11-11
      • 2012-09-03
      • 2011-04-10
      • 2010-11-08
      • 1970-01-01
      相关资源
      最近更新 更多