2

我一直在处理一些关于路线的问题。我已经定义了路线,但我不断收到 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!

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

基本上我不希望动作名称出现在 url ex 上:http://localhost:51081/Home/Home/25.04.2013.我想看到它http://localhost:51081/Home/25.04.2013 or http://localhost:51081/calendar

4

3 回答 3

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" }
);

并将其放在偏离路线的底部。

于 2013-04-25T13:58:51.747 回答
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

希望这能解释映射如何根据默认值工作。

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

于 2013-04-25T13:57:21.400 回答
1

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

您的“默认”和“行动”路线是相同的,因为它们具有相同的模式。“行动”可能永远不会受到打击。

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

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

您的“家”和“日历”路线也是相同的模式,所以只有一个会被击中(这将是第一个定义的)。

使您的路线更具体,并从最具体到最不具体的方式定义它们。

祝你好运!

于 2013-04-25T13:55:29.620 回答