如何删除/ Home /但在多个控制器时保持默认状态

时间:2015-04-20 13:00:44

标签: asp.net-mvc-4 routes

我看过几个类似的帖子,但没有一个是完全相同的,因为在我的问题中,我想从URL中删除HOME控制器,但控制器仍然是默认值(所以当我的网站从site.com加载时/我的家庭控制器中的索引被触发了!! !!

我的MVC4网站有几个控制器,例如

主页
产品
详细
AndAnother
YetAnother

Home控制器是我的默认控制器,是我的主页所在的位置,关于页面,联系我们等等

我想从URL中删除HOME,但这仍然是我的默认控制器。所有其他控制器应保留控制器名称。

以下不起作用,请注意默认控制器“WhatControllerGoesHere”

routes.MapRoute(
           name: "HomeController",
           url: "{action}/{id}",
           defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
       );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "WhatControllerGoesHere", action = "Index", id = UrlParameter.Optional }
        );

如果我同时设置默认控制器HOME,则无法导航到任何其他控制器

 routes.MapRoute(
           name: "HomeController",
           url: "{action}/{id}",
           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 }
        );

所以,我想要实现的网址是(在哪里和我们联系是我家中的观点)

site.com/                 //note, no Home/
site.com/about            //note, no Home/  
site.com/contact          //note, no Home/
site.com/products/  
site.com/products/other  
site.com/details/  
site.com/details/other  
site.com/details/AndAnother  

我知道我可以为每个控制器创建新的路由器但是如果可能的话我宁愿避免使用它。

1 个答案:

答案 0 :(得分:3)

除了site.com/aboutsite.com/contact之外,您显示的所有网址都将由默认路由正确处理。要从Home/about网址中删除contact前缀,您需要在默认值之前添加2条特定路由(假设您不需要id参数)

routes.MapRoute(
    name: "About",
    url: "About",
    defaults: new { controller = "Home", action = "About" }
);
routes.MapRoute(
    name: "Contact",
    url: "Contact",
    defaults: new { controller = "Home", action = "Contact" }
);
routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);