2010-12-14 41 views
6

Tôi đang cố gắng tìm ra cách liệt kê các URL của Routes trong RouteTable.Liệt kê các URL tuyến đường Route MVC ASP.NET

Trong kịch bản của tôi, tôi đã các tuyến đường sau đây định nghĩa:

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

Nói cách khác, nếu trang web của tôi là mysite.com, mysite.com/create gọi PadController.CreateNote(), và mysite.com/foobaris gọi PadController.Index() .

Tôi cũng có một lớp học mà mạnh mẽ các loại tên người dùng:

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

Trong constructor cho Username, tôi muốn kiểm tra để chắc chắn rằng name không phải là một con đường được xác định. Ví dụ: nếu điều này được gọi là:

var username = new Username("create"); 

Sau đó, ngoại lệ phải được ném. Tôi cần phải thay thế //... make sure 'name' isn't a route URL off root bằng cách nào?

Trả lời

4

Điều này không hoàn toàn trả lời những gì bạn muốn làm bằng cách ngăn người dùng đăng ký các từ được bảo vệ, nhưng có cách bạn có thể hạn chế tuyến đường của mình. Chúng tôi đã có/url tên người dùng trong trang web của chúng tôi và chúng tôi đã sử dụng một hạn chế như vậy.

Bạn chỉ cần giữ một danh sách các từ dành riêng, hoặc nếu bạn thực sự muốn nó tự động, bạn có thể sử dụng sự phản chiếu để có danh sách các bộ điều khiển trong không gian tên.

Bạn có thể truy cập bộ sưu tập tuyến đường bằng cách này. Vấn đề với cách tiếp cận này là nó đòi hỏi bạn phải đăng ký một cách rõ ràng tất cả các tuyến đường mà bạn muốn được "bảo vệ". Tôi vẫn giữ tuyên bố của tôi, bạn nên có một danh sách các từ khóa dành riêng được lưu trữ ở nơi khác.

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

Sẽ không hợp lý khi thêm boolean 'được bảo vệ' vào DataTokens cho một tuyến đường nhất định. Không nhất thiết phải đề xuất nó, nhưng sẽ không khó để quản lý. –

Các vấn đề liên quan