代码之家  ›  专栏  ›  技术社区  ›  Pure.Krome

ASP.NET MVC路由如何工作?

  •  7
  • Pure.Krome  · 技术社区  · 14 年前

    我定义了以下路线:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
        routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = "" }
        );
    
        // Added custom route here!
        routes.MapRoute(
            "CatchAll", 
            "{*catchall}," 
            new { controller = "Error", action = "NotFound" }
        );
    }
    

    没什么新鲜事-这是默认的ASP.NET MVC1 RegisterRoutes 方法,添加一个自定义路由。

    现在,如果我找到以下网址,我会得到404…

    http://whatever/Home/MissingActionMethod
    

    所以没有 ActionMethod 打电话 MissingActionMethod HomeController 。所以,这是否意味着,如果我到达上面定义的第一条路线……找不到动作……我要回来试试第二条路吗?冲洗重复?

    或者一旦我匹配了一条路线,我就尝试 执行 那条路……如果我失败了(即发现行动不见了)。那么……运气不好?博姆斯基?

    干杯!

    编辑/更新:

    感谢大家的回答,但他们没有正确地阅读我的问题:(我知道) 1)路线顺序很重要 b)haack的路由调试程序

    但我的问题不是这个。我在问……如果第一条路线是“处理的”…但失败了……然后它会进入下一个列表吗?

    所以,在我上面的例子中。第一个名为“默认”的路由与请求的URL/资源匹配…但是当框架试图找到一个缺少的操作时……是404的。

    所以…这是否意味着框架首先匹配“默认”路由。尝试一下……失败。。返回路线列表。试图找到 下一个 匹配的路线……最后失败了,然后就放弃了?

    或者它只找到它匹配的第一条路线。如果找不到控制器和/或动作。然后就放弃了,然后呢?(这是我怀疑的)。如果是的话……那么它是如何计算出404的呢?

    更新2:

    Phil Haack actually talks about my question 有点…但没有回答我好奇的部分——它如何以及在何处确定404资源未找到。

    3 回复  |  直到 14 年前
        1
  •  2
  •   Arnis Lapsa    14 年前

    路线!=动作。

    它是这样的-在传入请求时,路由模块在路由表中搜索匹配的第一个路由,然后尝试调用适当的操作。

    如果未找到操作,则请求失败并返回404(它不会尝试查找下一个路由)。


    但为了实现这一点,应该可以扩展框架。我的第一个猜测-你可以自己写 RouteHandler .

    1. 路由器处理程序
      不是特定于ASP.NET MVC的,RouteHandler是一个组件,用于决定在选择路由之后要做什么。显然,如果您更改了RouteHandler,则最终将在不使用ASP.NET MVC的情况下处理请求,但如果您希望直接使用某些特定的httphandler或甚至经典的WebForm处理路由,则这一点非常有用。

    不管怎样-不过我不推荐。最好保持路由哑。


    在快速的谷歌搜索之后-我不再那么乐观了。:)

        2
  •  2
  •   Mike Pateras    14 年前

    我认为它不会检查第二个路由,因为指定的第一个路由是默认路由。我认为如果您切换它们,它将检查catchall,查看它是否与URL中指定的路由不匹配,然后返回默认值,因为您只提供控制器名称,而不是路由。我想如果你想让Catchall做任何事,你就得打 http://whatever/CatchAll/Error/MissingActionMethod 它必须在违约之前出现。

    this 更多深入的信息。

        3
  •  1
  •   eKek0    14 年前

    您应该尝试使用Phil Haack的路由调试器 http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx ,查看匹配的路由和原因。