【问题标题】:How do ASP.NET MVC Routes work?ASP.NET MVC 路由如何工作?
【发布时间】:2010-03-13 14:29:34
【问题描述】:

我定义了以下路线:

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

所以在HomeController 中没有名为MissingActionMethodActionMethod。那么,这是否意味着,如果我转到上面定义的第一条路线.. 并且找不到操作.. 然后我会回来尝试第二条路线吗?重复冲洗?

或者一旦我匹配了一条路线,我就会尝试并执行该路线..如果我失败了(即,发现动作丢失)..那么..运气不好?蹦蹦跳跳?

干杯!

编辑/更新:

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

但我的问题与此无关。我在问..如果第一条路线已“处理”..但失败了..它会从列表中转到下一条吗?

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

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

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

更新 #2:

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

【问题讨论】:

  • 问:ASP.NET MVC 路由是如何工作的?答:很好! :)
  • @Arnis L. 但可能会更好。 :)
  • @Pure.Krome 抱歉。我想那一刻我又感到头晕了。 :D

标签: asp.net-mvc routes


【解决方案1】:

路线!= 行动。

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

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


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

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

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


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

【讨论】:

  • 好的。所以它返回 404。它会触发 HttpException 吗?如果是这样,那么任何自定义异常处理呢?是否可以抓住这个 404 错误并将其发送到您自己的页面?等等?
  • @Pure.Krome 可能有一种方法可以自定义路由/mvc 以根据需要工作。只是没有时间仔细看看。
【解决方案2】:

我认为它不会检查第二条路由,因为指定的第一个是默认路由。我认为如果您切换它们,它会检查 CatchAll,发现它与 URL 中指定的路由不匹配,然后回退到默认值,因为您只提供控制器名称,而不是路由。我想如果你想让 CatchAll 做任何事情,你必须点击http://whatever/CatchAll/Error/MissingActionMethod,它必须在默认值之前。

有关更多详细信息,请参阅this

【讨论】:

  • 简而言之 - 您指定路线的顺序是重要的
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    相关资源
    最近更新 更多