404设置非默认的ASP.net MVC路由后

时间:2013-10-24 11:36:29

标签: asp.net asp.net-mvc asp.net-mvc-4 routes

我正在使用ASPW MVC4和VWD Express 2010.我已经设置了一条额外的路线来删除URL中无关的/Home/,例如here和{{3}建议}。我确保按顺序排列它们:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Home",
            url: "{action}",
            defaults: new { controller = "Home", action = "Index" }
        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }

就删除/Home/而言,这是有效的,但现在我在尝试访问非默认控制器时得到404:

Server Error in '/' Application.

The resource cannot be found.

Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable.  Please review the following URL and make sure that it is spelled correctly. 

Requested URL: /LogItem/

我已将其跟踪到路线,因为如果我删除非默认路径,它再次正常工作。我不确定我做错了什么,而且通过我对其他答案和文档的理解,这应该有效。

修改:由于我的描述显然不清楚,因此我添加了“主页”路线,以便能够链接到/About/而不是/Home/About等。是谷歌搜索后发现的建议解决方案。我基本上希望它能够匹配HomeController与简写网址(/{action})实施的操作,以及我也完整添加的任何其他控制器(/{controller}/{action}/{optional id}

1 个答案:

答案 0 :(得分:0)

路线按先到先得的原则进行评估。你的家庭" route基本上说"如果你看到只有一个段的URL - 抓住它并处理它,那么假设该段是动作。当发生这种情况时,您注册的第二条路线没有机会处理该请求。

以特定错误为例,您正在请求" / LogItem"。 Home路线开始,解析" LogItem"作为操作的名称,并将其传递给默认控制器。由于该控制器可能没有LogIn操作,因此抛出404。

一种解决方案是改变路线的顺序。但即使这样,这两个也是重叠的,因为第二个也将处理具有1个段的URL,但将该段解释为控制器。它将执行默认操作(索引),而不是将处理传递给下一个路径。

为什么需要第一条路线?你想要实现什么目标?如果您提供更多上下文,我们可以找到实现这些路由的方法。