2010-07-26 22 views
31

Quiero eliminar el nombre del controlador de mi URL (para un controlador específico). Por ejemplo:ASP.NET MVC - Eliminar el nombre del controlador de la URL

http://mydomain.com/MyController/MyAction

me gustaría que este URL para cambiar a:

http://mydomain.com/MyAction

¿Cómo voy a ir haciendo esto en MVC? Estoy usando MVC2 si eso me ayuda de todos modos.

+0

Compruebe que el siguiente enlace ayudará a [Cómo eliminar el nombre del controlador de la url usando la ruta en MVC] (https://stackoverflow.com/questions/34650332/how-to-remove-the-controller-name-from- the-url-using-rout-in-mvc/34653793 # 34653793). –

+0

VER ACTUALIZACIÓN DE 2016 EN INFERIOR – niico

Respuesta

40

Debe correlacionar nueva ruta en el Global.asax (añadirlo antes de la opción por defecto), por ejemplo:

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

En MVC 4 tuve que hacer esto en RouteConfig.cs. También elimine la ruta predeterminada, no es suficiente para poner la línea antes. – David

+0

@David, la razón por la que tuvo que eliminar la ruta predeterminada es porque su acción de índice predeterminado de inicio coincide con 'routes.MapRoute (" Predeterminado "," {controlador}/{acción}/{id} ", nuevo {controlador =" Inicio ", acción =" Índice ", id = UrlParameter.Optional});' también. Obligará a la acción del índice MyController a representar en lugar de la acción de índice del controlador de su hogar porque su llamada a la página de inicio califica para esa "ruta". Puede reemplazar {acción} con el nombre real del método sin llaves de figura y SÓLO lo llamará cuando realice una llamada a esa acción específica. – TarasBulba

+0

Ver respuesta de enrutamiento de atributos a continuación. – niico

0

Vas a tener que modificar las rutas predeterminadas para MVC. Hay una explicación detallada en el blog de ScottGu: http://weblogs.asp.net/scottgu/archive/2007/12/03/asp-net-mvc-framework-part-2-url-routing.aspx

El método que debe cambiar es Application_Start. Algo como lo siguiente podría ayudar:

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

El orden de las rutas es significativo. Se detendrá en el primer partido. Por lo tanto, el predeterminado debe ser el último.

-2
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}); 
+0

'SpecificRoute' solo coincidirá si' MyController' está en la URL, el punto de la pregunta es * excluir * el controlador de la URL. Ver la respuesta de @ rrejc. – James

3

Aquí son los pasos para el nombre Separar el controlador de HomeController

Paso 1: crear la restricción de ruta.

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

Paso 2:
agregar una nueva asignación de rutas por encima de su asignación predeterminada que utiliza la restricción de ruta que acabamos de crear. El parámetro genérico debe ser la clase de controlador que planea usar como su controlador "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 } 
); 

Ahora usted debería ser capaz de acceder a sus métodos de controlador de casa, así: example.com/about, example.com/contact

Esto sólo afecta HomeController. Todos los demás controladores tendrán la funcionalidad de enrutamiento predeterminada.

8

Para actualizar esto para el año 2016, la mejor manera de hacerlo es usar Attribute Routing.

El problema de hacer esto en RouteConfig.cs es que la ruta de edad también siguen trabajando - por lo que tendrá tanto

http://example.com/MyController/MyAction

Y

http://example.com/MyAction

que tienen múltiples las rutas hacia la misma página son malas para SEO: pueden causar problemas en la ruta y crear páginas zombis y errores en toda la aplicación.

Con el enrutamiento de atributos puede evitar estos problemas. Todo lo que tiene que hacer es añadir esto a RouteConfig.cs (probablemente en la parte superior antes de que otras rutas pueden coincidir):

routes.MapMvcAttributeRoutes(); 

continuación, agregue la ruta de atributos a cada acción con el nombre de la ruta, por ejemplo

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