2010-12-14 7 views
6

RouteTableRoutesのURLを列挙する方法を理解しようとしています。私のシナリオではASP.NET MVCルートテーブルのルートURLを列挙する

、私は定義された以下の路線があります。私のサイトはmysite.com、mysite.com/createはPadController.CreateNote()を呼び出し、mysite.com/foobaris呼び出した場合、言い換えれば

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

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

これは、ユーザーが保護された単語を登録できないようにしたいと思っていることに完全には答えていませんが、経路を制約する方法があります。私たちのサイトには/ username 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に「保護された」ブール値を追加することは不合理ではありません。必ずしもそれを示唆するものではありませんが、管理することは特に難しいことではありません。 –

関連する問題