2011-09-16 13 views
8

me gustaría asignar a http://localhost/Guid-goes-hereResellerController y fuego Index acción del controlador que sólo cuando Guid-goes-here es no el vacío Guid.enrutamiento a un controlador con, no vacía parámetro requerido Guid

Mi tabla de enrutamiento se ve así:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute(
     "Reseller", 
     "{id}", 
     new { controller = "Reseller", action = "Index", id = Guid.Empty } 
     // We can mark parameters as UrlParameter.Optional, but how to make it required? 
    ); 

    routes.MapRoute(
     "Default", // Route name 
     "{controller}/{action}/{id}", // URL with parameters 
     new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
    ); 

} 

La acción en el ResellerController se parece a esto:

public ActionResult Index(Guid id) 
{ 
    // do some stuff with non-empty guid here 
} 

vez que la aplicación ha comenzado, navegando a http://localhost rutas mí al ResellerController con el Guid vacío como argumento para el parámetro action id.

+0

Usted puede hacer esto con una restricción de ruta, pero recomiendo utilizar URL más razonables si puede para que la ruta a los revendedores se vea como '/ reseller/{guid}'. La restricción de ruta tendrá que analizar todas las solicitudes HTTP para ver si son un GUID válido. – Cymen

+0

@Cymen yes pero se requiere ommiting/reseller/octet desde la URL en mi escenario. – Dariusz

Respuesta

15
public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute(
     "Reseller", 
     "{id}", 
     new { controller = "Reseller", action = "Index", id = UrlParameter.Optional }, 
     new { id = @"^(\{{0,1}([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}\}{0,1})$" } 
    ); 

    routes.MapRoute(
     "Default", // Route name 
     "{controller}/{action}/{id}", // URL with parameters 
     new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
    ); 
} 

o si desea una restricción más robusto que algunas expresiones regulares críptica:

public class GuidConstraint : IRouteConstraint 
{ 
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     var value = values[parameterName] as string; 
     Guid guid; 
     if (!string.IsNullOrEmpty(value) && Guid.TryParse(value, out guid)) 
     { 
      return true; 
     } 
     return false; 
    } 
} 

y luego:

routes.MapRoute(
    "Reseller", 
    "{id}", 
    new { controller = "Reseller", action = "Index", id = UrlParameter.Optional }, 
    new { id = new GuidConstraint() } 
); 
Cuestiones relacionadas