2013-06-18 42 views
18

Khu vực của tôi ở bên dưới. Chỉ phần liên quan mới được đánh dấu.trong Thư mục con

enter image description here

Route Table

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute(
     "SubFolder", // Route name 
     "SubFolder/ChildController", 
     new { controller = "ChildController", action = "Index" }, 
     new[] { "Practise.Areas.SOProblems.Controllers.SubFolder" }); 


    routes.MapRoute(
     "Default", // Route name 
     "{controller}/{action}", // URL with parameters 
     new { controller = "Home", action = "Index" } // Parameter defaults 
    ); 
} 

This only works when the url is like this 
localhost:2474/SOProblems/ChildController/index 

This does not works when the url is like this 
localhost:2474/SOProblems/SubFolder/ChildController/index 

bạn có thể vui lòng cho tôi biết những gì đang thiếu?

+0

"Không hoạt động" có nghĩa là chính xác là gì? – TGlatzer

+0

@ Grumbler85 - url được thử lần cuối cho 404, –

+0

Backtick chỉ ở đây "SubFolder'/ChildController"? Và kiểm tra xem bạn không gian tên bên trong thư mục con được đặt chính xác chưa. – TGlatzer

Trả lời

14

này không hoạt động khi url là như thế này localhost: 2474/SOProblems/thư mục con/ChildController/index

Đó là bình thường. Mô hình tuyến đường của bạn trông giống như sau: SubFolder/ChildController và không phải là SubFolder/ChildController/index. Ngoài ra, bạn đã xác định tuyến đường của mình ở địa điểm WRONG. Bạn đã xác định nó trong định nghĩa tuyến đường chính của bạn và không phải trong định nghĩa tuyến đường khu vực của bạn. Vì vậy, thoát khỏi định nghĩa đường tùy chỉnh từ các tuyến đường chính của bạn và thêm nó vào tập tin SOProblemsAreaRegistration.cs (đó là nơi SOProblems tuyến đường của bạn cần được đăng ký):

public override void RegisterArea(AreaRegistrationContext context) 
{ 
    context.MapRoute(
     "SubFolderRoute", 
     "SOProblems/SubFolder/ChildController", 
     new { controller = "ChildController", action = "Index" }, 
     new[] { "Practise.Areas.SOProblems.Controllers.SubFolder" } 
    ); 

    context.MapRoute(
     "SOProblems_default", 
     "SOProblems/{controller}/{action}/{id}", 
     new { action = "Index", id = UrlParameter.Optional } 
    ); 
} 

Cũng kể từ khi mô hình tuyến đường của bạn (SOProblems/SubFolder/ChildController) không có khả năng chỉ định một tên hành động, bạn chỉ có thể có một hành động trên bộ điều khiển này và đó sẽ là hành động mặc định mà bạn đã đăng ký (index) trong trường hợp này.

Nếu bạn muốn có nhiều hành động trên bộ điều khiển này nhưng chỉ số là một mặc định, bạn nên bao gồm rằng trong mô hình tuyến đường của bạn:

context.MapRoute(
    "SubFolder", 
    "SOProblems/SubFolder/ChildController/{action}", 
    new { controller = "ChildController", action = "Index" }, 
    new[] { "Practise.Areas.SOProblems.Controllers.SubFolder" } 
); 

Trong cả hai trường hợp định nghĩa tuyến đường chính của bạn có thể ở lại với các giá trị mặc định của họ :

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute(
     "Default", 
     "{controller}/{action}", 
     new { controller = "Home", action = "Index" } 
    ); 
} 
+2

"RegisterArea" xuất phát từ đâu? Tôi đã tìm kiếm toàn bộ giải pháp với kết quả bằng không. – usefulBee

+0

@usefulBee "RegisterArea" xuất hiện khi Visual Studio dàn dựng một _Add mới> Khu vực ..._ – Jasen

5

Tuyến đường mới của bạn "Thư mục con" không bao gồm khả năng bao gồm hành động trong tuyến đường (trong trường hợp của bạn là "Chỉ mục").

URL mẫu của bạn

localhost:2474/SOProblems/SubFolder/ChildController/index 

Muốn cố gắng để phù hợp với một tuyến đường như:

"SubFolder/ChildController/{action}" 

Nhưng bạn không bao gồm "{action}" trong lộ trình của bạn, vì vậy nó đã giành' t phù hợp với tuyến đường của bạn. Sau đó nó sẽ cố định tuyến mặc định, điều này rõ ràng là không thành công.

Cố gắng thêm "{action}" để định tuyến của bạn:

routes.MapRoute(
    "SubFolder", // Route name 
    "SubFolder/ChildController/{action}", 
    new { controller = "ChildController", action = "Index" }, 
    new[] { "Practise.Areas.SOProblems.Controllers.SubFolder" }); 

hoặc có "chỉ số" tắt URL thử nghiệm của bạn.

+2

Điều này không hoạt động. –

2

Đối với bất kỳ người dùng nào trong tương lai muốn làm điều này; Xem xét sử dụng các khu vực. Đây là một video hữu ích. Organizing an application using Areas

+0

Đây chính xác là những gì tôi đang tìm kiếm. Cảm ơn – MetalPhoenix

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