ASP.NET MVC路由如何工作?

Pur*_*ome 7 asp.net-mvc routes

我有以下路线定义:

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" }
    );
}
Run Code Online (Sandbox Code Playgroud)

没有什么新东西 - 这是默认的ASP.NET MVC1 RegisterRoutes方法,添加了一个自定义路由.

现在,如果我转到以下网址,我会收到404 ...

http://whatever/Home/MissingActionMethod
Run Code Online (Sandbox Code Playgroud)

所以没有ActionMethod所谓MissingActionMethodHomeController.所以,这是否意味着,如果我转到上面定义的第一条路线,并且未能找到行动......那么我是否会回来尝试第二条路线?冲洗,重复?

或者一旦我匹配路线,我然后尝试执行该路线..如果我失败(即,发现行动失踪)..那么......运气不好?boomski?

干杯!

编辑/ UPDATE:

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

但我的问题与此无关.我问的是..如果第一条路线是'处理'但是失败了......那么它会从列表中下载到下一条路线吗?

所以,在我上面的例子中.第一个名为'Default'的路由与请求的url/resource匹配...但是当框架试图找到一个缺少的动作时......它是404的.

那么..这是否意味着框架首先匹配"默认"路线..尝试它..失败..返回到路线列表..试图找到匹配的一条路线..最后失败所以它然后放弃?

或者它只找到它匹配的第一个也是唯一的第一个路线..如果它找不到控制器和/或动作......那么它只是放弃那里然后呢?(这是我怀疑的).如果是这样的话......然后如何弄清楚如何404?

更新#2:

Phil Haack实际上谈论了我的问题,但有点......但是没有回答我对此感到好奇的部分 - >它如何以及在何处确定未找到404资源.

Arn*_*psa 2

路线!=行动。

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

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


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

  1. RouteHandler
    并非真正特定于 ASP.NET MVC,RouteHandler 是决定选择路由后要执行的操作的组件。显然,如果您更改 RouteHandler,您最终会在没有 ASP.NET MVC 的情况下处理请求,但是如果您想直接使用某些特定的 HttpHanlder 甚至使用经典的 WebForm 来处理路由,这可能会很有用。

无论如何 - 但我不会推荐它。最好保持路由愚蠢。


经过一番快速谷歌搜索后——我对此不再那么乐观了。:)