2010-12-14 21 views
6

Próbuję wymyślić, jak wyliczyć adresy URL Routes w RouteTable.Wyliczanie adresów URL trasy ASP.NET MVC RouteTable

W moim scenariuszu Mam następujące trasy zdefiniowane:

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

Innymi słowy, jeśli moja strona jest mysite.com, mysite.com/create wywołuje PadController.CreateNote() i mysite.com/foobaris wywołuje PadController.Index() .

Mam także klasę silnie typy nazwy użytkownika:

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

w konstruktorze dla Username, chciałbym sprawdzić, aby upewnić się, że name nie jest określona trasa. Na przykład, jeśli jest to nazywane:

var username = new Username("create"); 

Następnie należy rzucić wyjątek. Co muszę zastąpić //... make sure 'name' isn't a route URL off root?

Odpowiedz

4

To nie w pełni odpowiada na pytanie, co chcesz zrobić, uniemożliwiając użytkownikom rejestrowanie chronionych słów, ale istnieje sposób, w jaki można ograniczyć trasy. Mieliśmy/username url's w naszej witrynie i użyliśmy takiego ograniczenia.

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

Być może po prostu trzeba zachować listę słów zastrzeżonych, lub, jeśli naprawdę chcesz to automatyczny, można ewentualnie użyć refleksji uzyskać listę sterowników w przestrzeni nazw.

Możesz uzyskać dostęp do kolekcji tras dzięki temu. Problem z tym podejściem polega na tym, że wymaga jawnej rejestracji wszystkich tras, które mają być "chronione". Wciąż trzymam się mojego oświadczenia, że ​​lepiej będzie mieć listę zastrzeżonych słów kluczowych przechowywanych gdzie indziej.

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

Dodanie "chronionej" wartości logicznej do DataTokens dla danej trasy nie byłoby nieuzasadnione. Niekoniecznie sugeruje to, ale nie byłoby to szczególnie trudne. –

Powiązane problemy