2010-12-14 19 views
6

Sto cercando di capire come enumerare gli URL di Routes nello RouteTable.Enumerazione degli URL di route RouteTable di ASP.NET MVC

Nel mio scenario, ho i seguenti itinerari definiti:

routes.MapRoute 
    ("PadCreateNote", "create", new { controller = "Pad", action = "CreateNote" }); 
routes.MapRoute 
    ("PadDeleteNote", "delete", new { controller = "Pad", action = "DeleteNote" }); 
routes.MapRoute 
    ("PadUserIndex", "{username}", new { controller = "Pad", action = "Index" }); 

In altre parole, se il mio sito è mysite.com, mysite.com/create invoca PadController.CreateNote(), e mysite.com/foobaris invoca PadController.Index() .

Ho anche una classe che fortemente tipi di nomi utente:

public class Username 
{ 
    public readonly string value; 

    public Username(string name) 
    { 
     if (String.IsNullOrWhiteSpace(name)) 
     { 
      throw new ArgumentException 
       ("Is null or contains only whitespace.", "name"); 
     } 

     //... make sure 'name' isn't a route URL off root like 'create', 'delete' 

     this.value = name.Trim(); 
    } 

    public override string ToString() 
    { 
     return this.value; 
    } 
} 

Nel costruttore per Username, vorrei controllare per assicurarsi che name non è un percorso definito. Ad esempio, se questo è chiamato:

var username = new Username("create"); 

Quindi deve essere generata un'eccezione. Di cosa ho bisogno per sostituire //... make sure 'name' isn't a route URL off root con?

risposta

4

Questo non risponde completamente a ciò che si vuole fare impedendo agli utenti di registrare parole protette, ma esiste un modo per limitare i percorsi. Avevamo/username url nel nostro sito e abbiamo usato un vincolo in questo modo.

routes.MapRoute(
       "Default",            // Route name 
       "{controller}/{action}/{id}",       // URL with parameters 
       new { controller = "Home", action = "Index", id = "" }, // Parameter defaults 
       new 
       { 
        controller = new FromValuesListConstraint(true, "Account", "Home", "SignIn" 
         //...etc 
        ) 
       } 
      ); 

routes.MapRoute(
       "UserNameRouting", 
        "{id}", 
        new { controller = "Profile", action = "Index", id = "" }); 

Si può avere solo per tenere un elenco di parole riservate, o, se si vuole veramente diventare automatico, si potrebbe utilizzare la reflection per ottenere un elenco dei controller nello spazio dei nomi.

È possibile accedere alla raccolta del percorso con questo. Il problema con questo approccio è che richiede la registrazione esplicita di tutti i percorsi che si desidera "proteggere". Continuo a ritenere che sarebbe meglio avere un elenco di parole chiave riservate memorizzate altrove.

System.Web.Routing.RouteCollection routeCollection = System.Web.Routing.RouteTable.Routes; 


var routes = from r in routeCollection 
      let t = (System.Web.Routing.Route)r 
      where t.Url.Equals(name, StringComparison.OrdinalIgnoreCase) 
      select t; 

bool isProtected = routes.Count() > 0; 
+1

Non sarebbe irragionevole aggiungere un valore booleano "protetto" ai DataToken per una determinata route. Non necessariamente lo suggerisce, ma non sarebbe particolarmente difficile da gestire. –