【发布时间】:2017-11-18 03:43:28
【问题描述】:
我在 Home 控制器中有一些简单的视图,例如“关于我们”和“联系我们”。
我希望 url 中没有 home 部分,例如 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 使用哪个路由并使用第一个来匹配。
我也知道我可以为每个控制器制作控制器,但这似乎是一种效率较低的方法。我不想以 30 个控制器结束,而只是为每个视图包装一个空视图操作。
无论如何,我可能最终都会为每个控制器制作控制器,但我想知道是否有办法制作一条类似 “如果只传递一个参数,首先检查它是否匹配控制器,如果不是,则假定它用于家庭控制器。”
【问题讨论】:
-
见Why map special routes first before common routes in asp.net mvc?。您需要 something 来告诉 MVC 何时跳过第一条路线并移动到第二条路线。最简单的选择是在路由配置中使用静态 URL,例如
ContactUs而不是使用{action}(它可以匹配任何内容)。属性路由是另一种选择,但它有自己的一组问题(即,当您创建属性时,您必须始终注意默认情况下属性具有 undefined order,因此您可能必须显式设置 Order 属性)。
标签: asp.net-mvc routes