即使我映射了我的路线,也要继续获得404

时间:2013-04-25 13:52:09

标签: c# asp.net asp.net-mvc

我一直在处理有关路线的一些问题。我已经定义了路线,但我一直得到404.以下是路线:

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

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

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

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

localhost:51081/login works! 
localhost:51081/Home/25.04.2013 works! 
localhost:51081/act doesnt work! 
localhost:51081/calendar/index doesnt work!

这里“登录”和“主页”有效,但“日历”和“行为”不起作用。当我将“日历”映射移动到顶部时,“主页”映射不起作用。你如何映射你的页面?

基本上我不希望动作名称显示在网址上:http://localhost:51081/Home/Home/25.04.2013.我希望看到它像http://localhost:51081/Home/25.04.2013 or http://localhost:51081/calendar

3 个答案:

答案 0 :(得分:3)

像@MarcGravell所说:你只为异常添加特殊规则

在您的情况下,路线日历和主页是相同的。 您可以通过将{controller}替换为Home来更具体地映射您的路由,因为该路由不是动态的,并且实际上是异常(它忽略了操作)

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

法案与日历相同,因此您不需要两条路线。只需拨打Act / New而不是Act。

对于默认使用:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}",
    defaults: new { controller = "Login", action = "Login" }
);

然后将它放在路线的底部。

答案 1 :(得分:2)

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

这定义了匹配//anything的路线; /将尝试使用LoginController.Login/anything会尝试使用anythingController.Login。请注意,此路由不允许它选择Login以外的任何“操作”。

如果你扔掉所有这些,并使用类似的东西:

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

然后它将匹配//anything/anything/anythingelse中的任何一个。

  • /将映射到HomeController.Index
  • /anything将映射到anythingController.Index
  • /anything/anythingelse将映射到anythingController.anythingelse

希望这能解释映射在默认情况下的工作原理。

如果您有任何特定路线,则应在之前添加 此一揽子默认路线。

答案 2 :(得分:1)

请记住,asp.net路由按照将它们添加到MapRoute表的顺序进行评估。

您的“默认”和“行为”路线是相同的,因为它们具有相同的模式。 “法案”可能永远不会被击中。

此外,您的“默认”路由非常通用,大多数请求都会满足它。您应该按照最具体(例如硬编码路线)的顺序将路线添加到最不具体(例如所有占位符)。

因此,如果我有foo / bar的请求,它将落入你的“默认”路由,因为“foo”将被解释为控制器 - 然后它将寻找“bar”的资源,这可能不会不存在。所以你会得到一个404。

您的“主页”和“日历”路线也是相同的模式,因此只有一个会受到影响(这将是第一个定义的)。

使您的路线更具体,并从最具体到最不明确定义。

祝你好运!