我有一些简单的视图,例如居住在主控制器中的“关于我们”和“联系我们”。当没有控制器通过url时,MVC路由规则默认为主控制器
我宁愿网址没有回家参加它像www.xyz.com/ContactUs
,而不是www.xyz.com/Home/ContactUs
我补充说,需要照顾这一点,但破坏其它控制器在URL中没有指定动作时,一条新的路线
// Home Routes
RouteTable.Routes.MapRoute("HomeRoute", "{action}", new { controller = "Home", action = "Index" });
// Default
RouteTable.Routes.MapRoute("Default", "{controller}/{action}", new { controller = "Home", action = "Index" });
很明显,这是因为路由引擎无法确定哪个路由用于像www.xyz.com/ContactUs
这样的url,并使用第1个匹配。
我也知道我可以为每个控制器,但这似乎是一种效率较低的方式。我不想结束30个控制器只是为了包装每个视图的一个空视图动作。
我可能会最终为每个控制器做出反应,但是想知道是否有办法制作一条类似于的路线“如果只传递了一个参数,首先检查它是否与控制器相匹配,如果不是假设它是家庭控制器的话。“
请参阅[为什么要在asp.net mvc中的常用路由之前先映射特殊路由?](https://stackoverflow.com/a/35674633/)。您需要*东西*告诉MVC何时跳过第一条路线并移至第二条路线。最简单的选择是在你的路由配置中使用静态URL,比如'ContactUs',而不是使用'{action}'(它可以真正匹配任何东西)。属性路由是另一种选择,但它有自己的一套问题(即,在创建属性时默认情况下,您必须知道属性具有* undefined order *,因此您可能必须显式设置Order属性) 。 – NightOwl888