2012-04-04 41 views
7

Tôi ổn với ~/ánh xạ tới Chỉ mục Trang chủ và với ~/ánh xạ Blog tới Chỉ mục Blog, nhưng làm cách nào để ngăn chặn ~/Lập bản đồ nhà cho Chỉ mục Trang chủ? Tôi không muốn các tuyến đường có thể truy cập từ nhiều hơn một điểm cuối.ASP.NET MVC 3 định tuyến: ngăn chặn ~/truy cập nhà?

Tương tự, làm cách nào để ngăn mọi hành động "Chỉ mục" khác có thể truy cập được từ cả ~/Controller và ~/Controller/Index?

OK ~/
NO ~/Nhà
NO ~/Home/Index
OK ~/AnyOtherController
NO ~/AnyOtherController/Index

Tôi đoán sự cai trị nên được một cái gì đó như ngăn chặn bất kỳ mặc định hành động có thể truy cập một cách rõ ràng, và trong trường hợp của nhà cũng ngăn chặn nó có thể truy cập chỉ với bộ điều khiển.

Việc này có thể thực hiện được không? Nó đã được thực hiện trong quá khứ? Ví dụ SO không làm điều này (bạn có thể truy cập here hoặc there) và cả hai đều hiển thị trang chủ; và họ có thể có tên hành động mặc định khác với "chỉ mục", có thể là một tuyến đường có thể truy cập được.

+0

này rất giống với một câu hỏi tôi hỏi vào ngày hôm sau: http://stackoverflow.com/questions/9974402/301-redirect-original-url-request-to-routed-url.Tôi không nói một bản sao của nó như tôi nghĩ hơi khác một chút, nhưng tôi cũng muốn biết câu trả lời cho điều này nữa. – Curt

+0

Tôi tò mò là tại sao bạn không muốn các tuyến đường có thể truy cập từ nhiều hơn một điểm cuối. –

+0

có thể xem xét sử dụng gói 'AttributeRouting' từ nuget để bạn có thể xác định rõ ràng tất cả tuyến đường của mình ... – dotjoe

Trả lời

4

thực hiện nó như thế này để cho những tuyến đường được coi là 404 lỗi nhưng vẫn trong phạm vi ứng dụng MVC của tôi (theo thứ tự cho các lỗi tùy chỉnh xem sẽ diễn ra):

/// <summary> 
    /// By not using .IgnoreRoute I avoid IIS taking over my custom error handling engine. 
    /// </summary> 
    internal static void RegisterRouteIgnores(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "IgnoreHome", 
      "Home", 
      new { controller = "Error", action = "NotFound" } 
     ); 

     routes.MapRoute(
      "IgnoreIndex", 
      "{controllerName}/Index/{*pathInfo}", 
      new { controller = "Error", action = "NotFound" } 
     ); 

này cho phép truy cập Home/Index hành động thông qua việc sử dụng /home/{id}, nhưng tôi sẵn sàng sống với điều đó.

+0

Cảm ơn bạn đã đăng những gì bạn đã sử dụng. –

4

Bạn chỉ có thể tuyên bố rằng định tuyến không nên được áp dụng cho các URL khớp với các mẫu đó. Ví dụ:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.Ignore("Home/{*pathInfo}"); 
    routes.Ignore("{controller}/Index"); 
} 

URL khớp với các tuyến đường này sau đó sẽ được coi là trang trống, tất nhiên sẽ không tồn tại.

+1

Anh ấy chắc chắn không muốn bỏ qua tất cả các hành động ** Home ** khác ngoài ** Chỉ mục **, vì vậy, thay đổi đầu tiên phải được thay đổi thành '" Home "'. –

0

Đây là cách tôi có thể đạt được những gì tôi nghĩ rằng yêu cầu của bạn.

// Portal Sections 
     routes.MapRoute("Home", 
         "", 
         new { controller = "Home", action = "Index" }, 
         new[] { "Myapp.Portal.Controllers" }); 

     routes.MapRoute("About", 
         "about", 
         new { controller = "Home", action = "About" }, 
         new[] { "Myapp.Portal.Controllers" }); 

     routes.MapRoute("Features", 
         "features", 
         new { controller = "Home", action = "Features" }, 
         new[] { "Myapp.Portal.Controllers" }); 


     routes.MapRoute("Help", 
         "help", 
         new { controller = "Help", action = "Index" }, 
         new[] { "Myapp.Portal.Controllers" }); 

     routes.MapRoute("Knowledgebase", 
         "help/kb", 
         new { controller = "Help", action = "Knowledgebase" }, 
         new[] { "Myapp.Portal.Controllers" }); 

tôi có thể Truy cập

  • mysite.com
  • mysite.com/about
  • mysite.com/features
  • mysite.com/help
  • mysite.com/ help/kb

nhưng truy cập không có sẵn cho

  • mysite.com/home/about
  • mysite.com/home/features

hy vọng sự giúp đỡ này :)

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