当没有控制器传入url时,MVC路由规则默认为Home控制器

时间:2017-11-18 03:43:29

标签: asp.net-mvc routes

我有一些简单的观点,例如"关于我们"和"联系我们"住在家庭控制器中。

我希望网址中不包含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的路线;如果只传递一个参数,请先检查看看它是否与控制器匹配,如果没有为家庭控制器假设它。"

1 个答案:

答案 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方法中为这些特定路由注册路由。 (这类似于通过属性路由定义路由,但我们在一个地方完成。确保在通用默认路由之前注册特定路由)。我个人更喜欢属性路由,因为我觉得它更具可读性。