【问题标题】:MVC 4 Remove "home" from base routeMVC 4 从基本路线中删除“家”
【发布时间】:2012-10-01 10:53:45
【问题描述】:

基本上我想这样做: http://website.com/Home/About

显示为: http://website.com/About

显示在 url 中的“home”控制器会使 url 更长,以供用户阅读。

我尝试执行以下操作:

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

有人可以帮帮我吗?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing


    【解决方案1】:

    试试这样的:

        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
        routes.MapRoute(
            "OnlyAction",
            "{action}",
            new { controller = "Home", action = "Index" } 
        );
    
        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );
    

    【讨论】:

    • 效果很好!谢谢....这里的顺序很重要...我很早就这样做了,但是...它在默认路线下,这使它无法正常工作。你太棒了,谢谢!
    • 在哪里添加这个,哪个文件?
    • 如果您的主页与您尝试操作的路径不同,请将{action} 更改为action。我试图删除 AboutUs 页面的控制器名称,但这样做只会使 AboutUs 页面成为“主页”
    • 这不是适当的解决方案,因为(例如)Index 页面的Manage 控制器不能与domain.com/manage 一起使用
    【解决方案2】:

    试试这个。它还会使您的网址小写。

            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
            routes.LowercaseUrls = true;
    
            routes.MapMvcAttributeRoutes();
    
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
    

    在你的 Home 控制器中:

        [Route("About")]
        public ActionResult About()
        {
            return View();
        }
    

    【讨论】:

    • 请记住,您可以将链接指定为小写,并且在地址栏中也显示为小写。它不区分大小写。
    【解决方案3】:

    第 1 步: 创建路由约束。

    public class RootRouteConstraint<T> : IRouteConstraint
        {
            public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
            {
                var rootMethodNames = typeof(T).GetMethods().Select(x => x.Name.ToLower());
                return rootMethodNames.Contains(values["action"].ToString().ToLower());
            }
        }
    

    第 2 步:
    在使用我们刚刚创建的路由约束的默认映射之上添加一个新的路由映射。通用参数应该是您计划用作“根”控制器的控制器类。

    routes.MapRoute(
                    "Root",
                    "{action}",
                    new {controller = "Home", action = "Index", id = UrlParameter.Optional},
                    new {isMethodInHomeController = new RootRouteConstraint<HomeController>()});
    
    
    
    
     routes.MapRoute(
                        "Default",
                        "{controller}/{action}/{id}",
                        new
                        {controller = "Home", action = "Index", id = UrlParameter.Optional}
                        );
    

    现在您应该可以像这样访问您的家庭控制器方法: example.com/about, example.com/contact

    这只会影响 HomeController。所有其他控制器将具有默认路由功能。

    【讨论】:

    • 不要复制/粘贴您对多个问题的回答。如果您能够复制和粘贴,则该问题很可能是重复的,因此应该关闭。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多