2010-12-14 20 views
6

Estoy tratando de averiguar cómo enumerar las URL de Routes en el RouteTable.Enumerando URL de ruta Route.able de ASP.NET MVC

En mi caso, me han definido las siguientes rutas:

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 otras palabras, si mi sitio es mysite.com, mysite.com/create invoca PadController.CreateNote() y mysite.com/foobaris invoca PadController.Index() .

también tengo una clase que fuertemente tipos de nombres de usuario:

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

En el constructor de Username, me gustaría comprobar para asegurarse de que name no es una ruta definida. Por ejemplo, si esto se llama:

var username = new Username("create"); 

Luego se debe lanzar una excepción. ¿Qué necesito para reemplazar //... make sure 'name' isn't a route URL off root con?

Respuesta

4

Esto no responde completamente lo que quieres hacer al evitar que los usuarios registren palabras protegidas, pero hay una forma de restringir tus rutas. Teníamos urls de/username en nuestro sitio y utilizamos una restricción como tal.

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

Es posible que sólo tiene que mantener una lista de palabras reservadas, o, si realmente lo desea automática, que posiblemente podría utilizar la reflexión para obtener una lista de los controladores en el espacio de nombres.

Puede acceder a la colección de rutas con esto. El problema con este enfoque es que requiere que se registren explícitamente todas las rutas que quiere que estén "protegidas". Sigo manteniendo mi afirmación de que sería mejor tener una lista de palabras clave reservadas almacenadas en otra parte.

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

No sería irrazonable agregar un booleano 'protegido' a los DataTokens para una ruta dada. No necesariamente sugiriéndolo, pero no sería particularmente difícil de manejar. –