尽管我画好了路线,但还是得到了404

本文关键字:管我 | 更新日期: 2023-09-27 18:10:56

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

这里的"登录"answers"主页"有效,但"日历"answers"行动"无效。当我把"日历"映射移到顶部时,"主页"映射就不起作用了。你是如何绘制页面的?

基本上,我不希望操作名称出现在url上,例如:http://localhost:51081/Home/Home/25.04.2013.我希望看到它像http://localhost:51081/Home/25.04.2013 or http://localhost:51081/calendar 一样

尽管我画好了路线,但还是得到了404

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

在您的情况下,路线"日历"answers"主页"是相同的。您可以通过将{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" }
);

把它放在偏离路线的底部。

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

希望这能解释映射在默认情况下是如何工作的。

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

请记住,asp.net路由的计算顺序是将它们添加到MapRoute表中的顺序。

您的"默认"answers"行为"路由是相同的,因为它们具有相同的模式。"表演"可能永远不会受到打击。

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

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

你的"主页"answers"日历"路线也是相同的模式,所以只有一条会被击中(这将是第一条定义的(。

让你的路线更加具体,并从最具体到最不具体地定义它们。

祝你好运!