尽管我画好了路线,但还是得到了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
一样
就像@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"日历"路线也是相同的模式,所以只有一条会被击中(这将是第一条定义的(。
让你的路线更加具体,并从最具体到最不具体地定义它们。
祝你好运!