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

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

http://mydomain.com/MyController/MyAction

我想这个url被改为:

http://mydomain.com/MyAction

我将如何去做这个在MVC? 我正在使用MVC2,如果这有助于我。

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

 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} ); 

为了在2016年更新这个function – 最好的方法是使用属性路由。

在RouteConfig.cs中这样做的问题是旧的路由也将工作 – 所以你会有两个

http://example.com/MyController/MyAction

http://example.com/MyAction

有多个路由到同一页面是不好的search引擎优化 – 可以导致path问题,并创build僵尸网页和整个应用程序的错误。

使用属性路由可以避免这些问题。 所有你需要做的就是把这个添加到RouteConfig.cs(可能在其他路线可能匹配之前的顶部):

 routes.MapMvcAttributeRoutes(); 

然后将路由属性添加到具有路由名称的每个操作,例如

 [Route("MyAction")] public ActionResult MyAction() { ... } 

这里是从HomeController中删除控制器名称的步骤

步骤1:创build路由约束。

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

 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。 所有其他控制器将具有默认的路由function。

您将不得不修改MVC的默认路由。 在ScottGu的博客上有详细的解释: http : //weblogs.asp.net/scottgu/archive/2007/12/03/asp-net-mvc-framework-part-2-url-routing.aspx

你应该改变的方法是Application_Start。 类似以下内容可能会有所帮助:

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

路线的sorting是重要的。 这将停止在第一场比赛。 因此,默认的应该是最后一个。

 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} );