我定义了以下路线:
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
。所以,这是否意味着,如果我转到上面定义的第一条路线,并且未能找到行动......那么我是否会回来尝试第二条路线?漂洗重复?
或者一旦我匹配路线,我就尝试执行那条路线..如果我失败了(即找不到行动)..那么......运气不好? boomski?
喝彩!
感谢回复,但他们没有正确地阅读我的问题:(我知道 1)路线的顺序很重要 b)haack的路由调试器
但我的问题与此无关。我问的是..如果第一条路线是'处理'但是失败了..那么它会从列表中下载到下一条路线吗?
所以,在我上面的例子中。第一个名为'Default'的路由与请求的url / resource匹配...但是当框架试图找到一个缺少的动作时......它是404的。
所以..这意味着框架首先匹配“默认”路线..尝试它..失败..返回到路线列表..试图找到匹配的下一个路线..然后失败所以它放弃了?
或者它只找到它匹配的第一个也是唯一的第一条路线..如果它找不到控制器和/或动作......那么它只是放弃那里然后呢? (这是我怀疑的)。如果是这样的话,那怎么会弄清楚如何404?
Phil Haack actually talks about my question,有点......但没有回答我对此感到好奇的部分 - >它如何以及在何处确定未找到404资源。
答案 0 :(得分:2)
我认为它不会检查第二条路线,因为指定的第一条路线是默认路线。我想如果你切换它们,它会检查CatchAll,看它与URL中指定的路由不匹配,然后回退到默认值,因为你只提供一个控制器名称,而不是路由。我想如果你想让CatchAll做任何事情,你必须点击http://whatever/CatchAll/Error/MissingActionMethod,它必须在默认值之前。
有关更深入的信息,请参阅this。
答案 1 :(得分:2)
路线!=行动。
就像这样 - 在传入请求时,路由模块在路由表中搜索匹配的第一个路由,然后尝试调用适当的操作。
如果未找到操作,请求将失败并返回404(它不会尝试查找下一个路径)。
但是应该可以扩展框架以实现这一目标。我的第一个猜测 - 您可以编写自己的RouteHandler
。
- RouteHandler
醇>
不是特定于ASP.NET MVC,RouteHandler是决定在选择路由后要做什么的组件。显然,如果您更改RouteHandler,则最终在没有ASP.NET MVC的情况下处理请求,但如果您想直接使用某些特定的HttpHanlders或甚至使用经典的WebForm处理路由,这将非常有用。
无论如何 - 我不会推荐它。保持路由愚蠢是最好的。
经过一些快速的谷歌搜索 - 我不再那么乐观了。 :)
答案 2 :(得分:1)
您应该尝试使用来自http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx的Phil Haack路由调试器,以查看匹配的路由和原因。