代码之家  ›  专栏  ›  技术社区  ›  James

ASP.NET MVC-从URL中删除控制器名称

  •  35
  • James  · 技术社区  · 14 年前

    我想从我的URL中删除控制器名称(对于一个特定的控制器)。例如:

    http://mydomain.com/MyController/MyAction

    我希望将此URL更改为:

    http://mydomain.com/MyAction

    在MVC中我该怎么做?如果这对我有帮助的话,我正在使用MVC2。

    5 回复  |  直到 6 年前
        1
  •  44
  •   rrejc    14 年前

    您应该在global.asax中映射新的路由(将其添加到默认路由之前),例如:

    routes.MapRoute("SpecificRoute", "{action}/{id}", new {controller = "MyController", action = "Index", id = UrlParameter.Optional});
    
    // default route
    routes.MapRoute("Default", "{controller}/{action}/{id}", new {controller = "Home", action = "Index", id = UrlParameter.Optional} );
    
        2
  •  17
  •   niico    6 年前

    要在2016/17/18更新此信息,最好的方法是使用属性路由。

    在routeconfig.cs中这样做的问题是,旧的路由仍然可以工作-因此您将同时拥有这两个路由

    http://example.com/MyController/MyAction

    http://example.com/MyAction

    有多个路由到同一个页面对SEO有害-可能导致路径问题,并在整个应用程序中创建僵尸页面和错误。

    通过属性路由,您可以避免这些问题,并且更容易看到在哪里路由。您所要做的就是将其添加到routeconfig.cs(可能在其他路由匹配之前位于顶部):

    routes.MapMvcAttributeRoutes();
    

    然后将route属性添加到每个具有route name的操作中,例如

    [Route("MyAction")]
    public ActionResult MyAction()
    {
    ...
    }
    
        3
  •  4
  •   Tieson T.    8 年前

    以下是从主控制器中删除控制器名称的步骤

    步骤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:
    在使用我们刚刚创建的路由约束的默认映射之上添加新的路由映射。通用参数应该是计划用作__root_控制器的控制器类。

    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,关于, 示例.com/contact

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

        4
  •  0
  •   sukru    14 年前

    您必须修改MVC的默认路由。斯科特古的博客上有一个详细的解释: http://weblogs.asp.net/scottgu/archive/2007/12/03/asp-net-mvc-framework-part-2-url-routing.aspx

    您应该更改的方法是应用程序启动。类似以下内容可能会有所帮助:

    RouteTable.Routes.Add(new Route(
      Url="MyAction"
      Defaults = { Controller = "MyController", action = "MyAction" },
      RouteHandler = typeof(MvcRouteHandler)
    }
    

    路线的顺序非常重要。第一场比赛就停了。因此,默认值应该是最后一个。

        5
  •  -3
  •   David Watts    10 年前
    routes.MapRoute("SpecificRoute", "MyController/{action}/{id}", 
             new {controller = "MyController", action = "Index", 
             id = UrlParameter.Optional});
    
    // default route
    routes.MapRoute("Default", "{controller}/{action}/{id}", 
             new {controller = "Home", action = "Index", 
             id = UrlParameter.Optional} );