2010-12-14 79 views
6

我想弄清楚如何枚舉Routes的URL在RouteTable枚舉ASP.NET MVC RouteTable路由URL

在我的情況,我有以下途徑定義:

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

換句話說,如果我的網站是mysite.com,mysite.com/create調用PadController.CreateNote()和mysite.com/foobaris調用PadController.Index()

我也有一類是強類型的用戶名:

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

在構造爲Username,我想檢查,以確保name不是定義路線。例如,如果這被稱爲:

var username = new Username("create"); 

然後應該拋出一個異常。我需要用什麼替換//... make sure 'name' isn't a route URL off root

回答

4

這並不能完全回答你想通過阻止用戶註冊受保護詞語來做什麼,但是有一種方法可以限制你的路由。我們在我們的網站中有/用戶名url,我們使用了這樣的約束。

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

您可能只需要保留的保留字列表,或者,如果你真的想它自動的,你可能使用反射來獲取命名空間中的控制器的列表。

您可以使用它訪問路線集合。這種方法的問題是它要求你顯式註冊你想要「保護」的所有路線。我仍然堅持我的發言,你最好有一個保留在其他地方的關鍵字列表。

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

向給定路線的DataTokens添加'受保護的'布爾值不是不合理的。不一定建議,但管理起來並不困難。 – 2010-12-14 19:31:36