2011-09-16 13 views
8

desidero mappare http://localhost/Guid-goes-here a ResellerController e fuoco Index azione di quel controllore solo quando Guid-goes-here è non vuoto GUID.routing al controllore con una richiesta, non vuota parametro GUID

mia tabella di percorso è simile al seguente:

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

} 

L'azione sul ResellerController assomiglia a questo:

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

Una volta che l'applicazione è stata avviata, la navigazione verso http://localhost percorsi me al ResellerController con la guida vuota come argomento per il parametro id dell'azione .

+0

Si può fare questo con un vincolo del percorso, ma ti consiglio vivamente di utilizzare URL più sensibili se puoi in modo che il percorso verso i rivenditori sia simile a "/ reseller/{guid}". Il vincolo del percorso dovrà analizzare tutte le richieste HTTP per vedere se sono un GUID valido. – Cymen

+0

@Cymen yes ma ommiting/reseller/octet dall'URL è richiesto nel mio scenario. – Dariusz

risposta

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 se si desidera un vincolo più robusto di quanto alcuni regex criptico:

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

e poi:

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