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
和
有多个路由到同一页面是不好的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} );