¿Cómo configuro el enrutamiento MVP de ASP.NET para ocultar el nombre del controlador en una página de “inicio”?

A continuación de esta pregunta:

Enrutamiento ASP.NET MVC con controlador predeterminado

Tengo un requisito similar donde mi usuario final no quiere ver el nombre del controlador en la url para el aterrizaje o “página de inicio” para su aplicación.

Tengo un controlador llamado DeviceController que quiero ser el controlador de “página de inicio”. Este controlador tiene una serie de acciones y me gustaría usar las URL como las siguientes:

 http://example.com -> llamadas Índice ()  
 http://example.com/showdevice/1234 -> llamadas ShowDevice (int id)  
 http://example.com/showhistory/1224 -> llamadas ShowHistory (int id)  

También necesito que los enlaces generados para este controlador dejen afuera la parte /device de la url.

También tengo una serie de otros controladores, por ejemplo BuildController :

 http://example.com/build  
 http://example.com/build/status/1234  
 http://example.com/build/restart/1234  

y así. Las URL para estos controladores están bien tal como están.

El problema es que parece que no puedo entender el enrutamiento de esto incluso después de estudiar las respuestas a la pregunta mencionada anteriormente.

¿Alguien puede proporcionar una muestra de código que explique cómo hacer esto?

Estoy usando ASP.NET MVC2.

Prueba esto:

  private void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute("default", "{controller}/{action}/{id}", new { action = "index", id = "" }, // Register below the name of all the other controllers new { controller = @"^(account|support)$" }); routes.MapRoute("home", "{action}", new { controller = "device", action = "index" }); } 

por ejemplo / foo

Si foo no es un controlador, se trata como una acción del controlador del device .

Paso 1: crea la restricción de ruta.

 public class RootRouteConstraint : 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:
Agregue una nueva asignación de ruta 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()} ); routes.MapRoute( "Default", "{controller}/{action}/{id}", new {controller = "Home", action = "Index", id = UrlParameter.Optional} ); 

Ahora debería poder acceder a los métodos de su controlador doméstico de esta manera: example.com/about, example.com/contact

Esto solo afectará la URL de HomeController. Todos los demás controladores tendrán la funcionalidad de enrutamiento predeterminada.