0

我正在将 ASP.net MVC4 与 VWD Express 2010 一起使用。我已经设置了一个额外的路由来/Home/从 URL中删除无关内容,如此此处所建议的那样。我确保将它们按正确的顺序排列:

    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使用速记 URL ( /{action}) 以及我还完整添加的任何其他控制器( /{controller}/{action}/{optional id})实现的操作相匹配

4

1 回答 1

0

路线按照先到先得的原则进行评估。您的“主页”路由基本上是说“如果您看到一个只有一个段的 URL - 抓住它并处理它,然后假设该段是操作。当这种情况发生时,您注册的第二条路由没有机会处理请求。

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

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

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

于 2013-10-24T11:50:23.517 回答