2009-02-04 17 views
19

Estoy empezando con ASP.NET MVC.ASP.NET MVC - MapRoute versus routes.Add (y 404s)

¿Cuál es la diferencia entre MapRoute y routes.Add? ¿Debería estar usando MapRoute? ¿Puedo mapear múltiples rutas? ¿Qué "mapas" tienen prioridad ... los que llamaste primero o último?

Me gustaría poder hacer algo similar a lo que StackOverflow hace por los usuarios. Pero me gustaría que la dirección URL para adaptarse a este patrón:
"Usuario/{} de dominio/nombre de usuario {}" a ser encaminado a un UserController

y para todas las demás peticiones que hacer la típica enrutamiento ASP.NET MVC. por ejemplo:

 routes.MapRoute(
      "Default", "{controller}/{action}/{id}", 
      new { controller = "Home", action = "Index", id = "" } 
     ); 

ACTUALIZACIÓN:
Cuando se utiliza la URL: http://localhost:3962/User/MYDOMAIN/BTYNDALL
me sale el error: HTTP 404. El recurso que busca (o una de sus dependencias) podría haber sido retirado, cambió su nombre, o está temporalmente no disponible.

Aquí está el código que estoy usando:

public class MvcApplication : System.Web.HttpApplication 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "User",              
      "User/{domain}/{username}",       
      new { controller = "User", action = "Index" }  
     ); 

     routes.MapRoute(
      "Default",            
      "{controller}/{action}/{id}",       
      new { controller = "Home", action = "Index", id = "" } 
     ); 

    } 

    protected void Application_Start() 
    { 
     RegisterRoutes(RouteTable.Routes); 
    } 
} 
+5

Su actualización de esta pregunta es realmente una pregunta diferente ... ¿Seguro que quiere mezclarlos? – DSO

+0

Puede pegar el código del método Index en el controlador de usuario. – JMS

+0

DSO, tal vez. Mis suposiciones sobre la forma en que funcionan las rutas fueron correctas. Las rutas establecidas primero tienen prioridad, confirmadas por Brannon. Pero estoy obteniendo este raro error 404. Tal vez otros usuarios se toparán con esto al mismo tiempo que tienen preguntas acerca de la prioridad de enrutamiento. – BuddyJoe

Respuesta

9

Su controlador usuario debe tener

public class UserController : Controller { 
    public ActionResult Index(string domain, string username) { return View(); } 
} 

Las dos variables en el método del índice del controlador de usuario son recogidas de la ruta.

+0

Hmm, sigo recibiendo el error. – BuddyJoe

+0

Espera ... no, eso lo hizo. Tuve un error tipográfico Gracias JMs. – BuddyJoe

37

MapRoute() es un método de extensión sobre Routes.Add(). Use MapRoute(), a menos que necesite hacer algo más complejo de lo que permite.

Las rutas se evalúan en el orden en que están definidas, por lo que las que llamó primero.

+0

Eso es lo que pensé. Y estoy teniendo mi primera ruta completamente pasada por alto. ver la actualización en la pregunta – BuddyJoe

+0

Esta es la respuesta correcta a la pregunta original, que también coincide con el título (por lo que ayuda a las personas que buscan SO para "MapRoute vs Add"). @BuddyJoe, considere marcar esto como la respuesta. – tsemer

4

Uso!

public class MvcApplication : System.Web.HttpApplication 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "User",              
      "User/{domain}/{username}",       
      new { controller = "User", action = "Index", username= UrlParameter.Optional }  
     ); 

     } 

    protected void Application_Start() 
    { 
     RegisterRoutes(RouteTable.Routes); 
    } 
}