2010-12-14 12 views
6

Ich versuche herauszufinden, wie die URLs Routes in der RouteTable aufgelistet werden.Auflisten der URLs von ASP.NET MVC RouteTable-Routen

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

Mit anderen Worten, wenn meine Website mysite.com ist, mysite.com/create PadController.CreateNote() ruft, und mysite.com/foobaris ruft PadController.Index():

In meinem Szenario habe ich die folgenden Routen definiert .

Ich habe auch eine Klasse, die stark Arten von Benutzername:

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

im Konstruktor für Username, würde Ich mag, um sicherzustellen, zu überprüfen, ob name nicht eine definierte Strecke ist. Zum Beispiel, wenn dies aufgerufen wird:

var username = new Username("create"); 

Dann sollte eine Ausnahme ausgelöst werden. Was muss ich ersetzen //... make sure 'name' isn't a route URL off root mit?

Antwort

4

Dies beantwortet nicht vollständig, was Sie tun möchten, indem Sie verhindern, dass Benutzer geschützte Wörter registrieren, aber Sie können Ihre Routen einschränken. Wir hatten/username URLs in unserer Website und wir haben eine Einschränkung wie folgt verwendet.

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

Sie können nur eine Liste der reservierten Wörter halten müssen, oder, wenn Sie es wirklich automatische möchten, können Sie möglicherweise Reflexion verwenden könnte eine Liste der Controller im Namensraum zu erhalten.

Sie können damit auf die Routensammlung zugreifen. Das Problem bei diesem Ansatz ist, dass Sie explizit alle Routen registrieren müssen, die Sie "schützen" möchten. Ich halte mich immer noch an meine Aussage, dass es besser wäre, eine Liste von reservierten Keywords an anderer Stelle zu speichern.

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

Es wäre nicht unvernünftig, den DataTokens für eine bestimmte Route einen 'geschützten' Booleschen Wert hinzuzufügen. Nicht unbedingt suggerieren, aber es wäre nicht besonders schwierig zu verwalten. –

Verwandte Themen