2008-12-12 36 views
46

tuyến ASP.NET MVC có tên khi ánh xạ:Làm thế nào tôi có thể nhận được tên tuyến đường trong bộ điều khiển trong ASP.NET MVC?

routes.MapRoute(
    "Debug", // Route name -- how can I use this later???? 
    "debug/{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = string.Empty }); 

Có cách nào để có được những tên đường, ví dụ "Gỡ lỗi" trong ví dụ trên? Tôi muốn truy cập nó trong OnActionExecuting của bộ điều khiển để tôi có thể thiết lập nội dung trong ViewData khi gỡ lỗi, ví dụ, bằng cách đặt trước một URL với/debug/...

Trả lời

66

Tên tuyến đường không được lưu trữ trong tuyến đường không may. Nó chỉ được sử dụng trong nội bộ trong MVC như là một chìa khóa trong một bộ sưu tập. Tôi nghĩ rằng đây là một cái gì đó bạn vẫn có thể sử dụng khi tạo liên kết với HtmlHelper.RouteLink ví dụ (có thể ở một nơi khác quá, không có ý tưởng).

Dù sao, tôi cần điều đó quá và đây là những gì tôi đã làm:

public static class RouteCollectionExtensions 
{ 
    public static Route MapRouteWithName(this RouteCollection routes, 
    string name, string url, object defaults, object constraints) 
    { 
     Route route = routes.MapRoute(name, url, defaults, constraints); 
     route.DataTokens = new RouteValueDictionary(); 
     route.DataTokens.Add("RouteName", name); 

     return route; 
    } 
} 

Vì vậy, tôi có thể đăng ký một con đường như thế này:

routes.MapRouteWithName(
    "myRouteName", 
    "{controller}/{action}/{username}", 
    new { controller = "Home", action = "List" } 
    ); 

Trong hành động điều khiển của tôi, tôi có thể truy cập vào các tuyến đường tên với:

RouteData.DataTokens["RouteName"] 

Hy vọng điều đó sẽ hữu ích.

+4

Giải pháp thay thế tuyệt vời, mặc dù nó có vẻ như một sự giám sát mà MVC không cấp quyền truy cập vào nó. Bạn nói đúng - bạn có thể tạo liên kết tuyến đường bằng cách chỉ định tên, vì vậy nó được lưu trữ ở đâu đó :-) –

+3

Đây không phải là mục đích của tên tuyến đường ngay từ đầu. Tên có nghĩa là cung cấp một chỉ mục khi tạo một URL bằng cách sử dụng Định tuyến cho phép bạn chỉ định lộ trình sử dụng. DataTokens thực sự là đúng cách để làm điều đó. Ví dụ: giả sử bạn có nhiều tuyến đường "Gỡ lỗi". Bạn không thể sử dụng tên cho nó anyways. Nhưng bạn luôn có thể tạo mã thông báo dữ liệu của riêng mình. Định tuyến bỏ qua các thẻ dữ liệu nhưng chuyển chúng đi cùng để mã của bạn có thể thực hiện việc giải thích ý nghĩa của chúng. – Haacked

+0

vẫn là giám sát vì hai lý do: thứ nhất, mọi người dường như thấy nó hữu ích và thứ hai, tại sao MapRoute lấy tên làm đối số nhưng khi xây dựng một tuyến mới với một hàm tạo không có đối số Tên trong đó. – mare

-1

tùy chọn khác - sử dụng MapRoute với string [] namespace cãi nhau, sau đó bạn có thể nhìn thấy không gian tên của bạn như RouteData.DataTokens["Namespaces"]

0

Một giải pháp thay thế có thể sử dụng cấu hình giải pháp:

protected override OnActionExecuting() 
{ 
    #if DEBUG 

     // set up stuff in the ViewData 

    #endif 

    // continue 
} 

Có nên không thực sự bao giờ là một nhu cầu để tham khảo tên tuyến đường như thế này - mà tôi cho là lý do tại sao MVC làm cho nó rất khó khăn để làm điều này loại điều.

0

Điều này không trực tiếp trả lời câu hỏi (nếu bạn muốn trở thành pedantic); tuy nhiên, mục tiêu thực sự dường như là lấy URL cơ bản của tuyến đường, được đặt tên tuyến đường. Vì vậy, đây là cách tôi đã làm nó:

tuyến đường của tôi đã được xác định trong RouteConfig.cs như:

routes.MapRoute(
      name: "MyRoute", 
      url: "Cont/Act/{blabla}", 
      defaults: new { controller = "Cont", action = "Act"} 
     ); 

Và để có được URL cơ sở của đường:

var myRoute = Url.RouteUrl("MyRoute", new { blabla = "blabla" }).Replace("blabla", ""); 

Nó đã cho tôi URL cơ sở của đường mà tôi muốn:

/Cont/Act/ 

Hy vọng điều này sẽ hữu ích.

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