我一直在处理有关路线的一些问题。我已经定义了路线,但我一直得到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
答案 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。
您的“主页”和“日历”路线也是相同的模式,因此只有一个会受到影响(这将是第一个定义的)。
使您的路线更具体,并从最具体到最不明确定义。
祝你好运!