我有一些简单的观点,例如"关于我们"和"联系我们"住在家庭控制器中。
我希望网址中不包含www.xyz.com/ContactUs
而不是www.xyz.com/Home/ContactUs
我添加了一个处理此问题的新路由,但在未在网址中指定操作时会中断其他控制器
// 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
等网址,并使用第一个匹配。
我也知道我可以为每个制作控制器,但这似乎是一种效率较低的方式。我不想最终得到30个控制器,只是为每个视图包装一个空视图操作。
我可能最终会为每个人制作控制器,但想知道是否有办法制作类似&#34的路线;如果只传递一个参数,请先检查看看它是否与控制器匹配,如果没有为家庭控制器假设它。"
答案 0 :(得分:2)
您可以使用MVC属性路由来创建这些SEO友好路线。
[Route("About")]
public ActionResult About()
{
return View();
}
[Route("Contact")]
public ActionResult Contact()
{
return View();
}
假设您启用了属性路由。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index",
id = UrlParameter.Optional }
);
}
另一种选择是让2条路线注册类似于您尝试过的路线。它将用于处理yourSite/About/
之类的请求(它将呈现在HomeController中执行About
操作)。但是,当您请求类似yourSite/Books
的内容时,Index
Books
操作符不会处理它,因为该网址与我们为SEO友好路由定义的第一个模式匹配,您将获得如果Books
中没有HomeController
操作方法,则为404! (如果你没有这条路线注册,那就行了)
routes.MapRoute(
name: "JustActions",
url: "{action}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
另一个选择,如果您不喜欢属性路由方法,则可以逐个在RegisterRoutes
方法中为这些特定路由注册路由。 (这类似于通过属性路由定义路由,但我们在一个地方完成。确保在通用默认路由之前注册特定路由)。我个人更喜欢属性路由,因为我觉得它更具可读性。