2010-12-14 36 views
6

J'essaie de comprendre comment énumérer les URL de Routes dans le RouteTable.Énumérer les URL de routage ASP.NET MVC RouteTable

Dans mon scénario, j'ai les routes suivantes définies:

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

En d'autres termes, si mon site est mysite.com, mysite.com/create invoque PadController.CreateNote() et mysite.com/foobaris PadController.Index() invoque .

J'ai aussi une classe fortement les noms d'utilisateur types:

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

Dans le constructeur pour Username, je voudrais vérifier pour vous assurer que name n'est pas un itinéraire défini. Par exemple, si cela s'appelle:

var username = new Username("create"); 

Ensuite, une exception doit être émise. De quoi ai-je besoin pour remplacer //... make sure 'name' isn't a route URL off root?

Répondre

4

Cela ne répond pas entièrement à ce que vous voulez faire en empêchant les utilisateurs d'enregistrer des mots protégés, mais il existe un moyen de restreindre vos routes. Nous avions url/nom d'utilisateur dans notre site et nous avons utilisé une contrainte comme ça.

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 = "" }); 

Vous pouvez juste avoir à tenir une liste des mots réservés, ou, si vous le voulez vraiment automatique, vous pouvez éventuellement utiliser la réflexion pour obtenir une liste des contrôleurs dans l'espace de noms.

Vous pouvez accéder à la collection de routes avec ceci. Le problème avec cette approche est qu'il vous oblige à enregistrer explicitement toutes les routes que vous souhaitez être "protégées". Je tiens toujours à ma déclaration que vous feriez mieux d'avoir une liste de mots-clés réservés stockés ailleurs.

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

Il ne serait pas déraisonnable d'ajouter un booléen 'protected' aux DataTokens pour une route donnée. Pas nécessairement le suggérer, mais ce ne serait pas particulièrement difficile à gérer. –