2011-10-15 28 views
5

Có lẽ tôi không hiểu chính xác cách các Vùng MVC hoạt động, nhưng điều này khiến tôi hơi bối rối.Bộ điều khiển vùng MVC3 ASP.NET có thể truy cập từ các tuyến toàn cầu?

  1. Thêm một khu vực gọi là "MyArea" sử dụng kích chuột phải vào "Add Diện tích" trong Visual Studio trên dự án MVC3
  2. Tạo một bộ điều khiển cho MyArea: "AnArea" với phù hợp với quan điểm trong khu vực MyArea.
  3. Add "controller = 'AnArea' để tham số mặc định context.MapRoute trong phương pháp MyAreaAreaRegistration.RegisterArea.

Vì vậy, vào thời điểm này nếu bạn khởi động ứng dụng và điều hướng đến/MyArea/cần tải bộ điều khiển AnArea với nó phù hợp với quan điểm Nếu bạn điều hướng đến/MyArea/AnArea, nó sẽ hiển thị các kết quả tương tự

Nhưng, nếu bạn điều hướng đến/AnArea /, bộ điều khiển vẫn còn được tìm thấy và được thông báo lỗi sau đây được hiển thị:..

The view 'Index' or its master was not found or no view engine supports the searched locations. The following locations were searched: 
~/Views/anarea/Index.aspx 
~/Views/anarea/Index.ascx 
~/Views/Shared/Index.aspx 
~/Views/Shared/Index.ascx 
~/Views/anarea/Index.cshtml 
~/Views/anarea/Index.vbhtml 
~/Views/Shared/Index.cshtml 
~/Views/Shared/Index.vbhtml 

Đây có phải là hành vi đúng đắn không? Tôi đã nghĩ rằng bộ điều khiển của một khu vực chỉ có thể được truy cập thông qua khu vực riêng của nó và không phải trên toàn cầu.

+0

có thể trùng lặp của [ASP.NET MVC tuyến mặc định có thể truy cập thông qua các tuyến đường khu vực] (http://stackoverflow.com/questions/4612279/asp-net-mvc-default-routes-accessible-via-area-routes) –

Trả lời

6

Bất cứ khi nào tôi có thể tạo một dự án với các khu vực, tôi thay đổi tuyến đường Default của tôi như sau:

routes.MapRoute( 
     "Default", // Route name 
     "{controller}/{action}/{id}", // URL with parameters 
     new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // defaults 
     null, // constraints 
     new string[] { "MyApplication.Controllers" } // namespaces 
    ); 

Tham số thức hạn chế các tuyến đường mặc định để các bộ điều khiển trong không gian tên MyApplication.Controllers. Điều này đảm bảo rằng tuyến đường Mặc định bị giới hạn ở các hành động bên ngoài bất kỳ khu vực nào.

CẬP NHẬT

Sau một lần lặn sâu xuống mã, tôi phát hiện ra nơi vấn đề nảy sinh, và có một giải pháp. Thay đổi Tuyến đường mặc định của bạn thành:

routes.Add(
    "Default", 
    new Route("{controller}/{action}/{id}", 
     new RouteValueDictionary(
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ), 
     null, 
     new RouteValueDictionary(
      new { 
       Namespaces = new string[] { "MyApplication.Controllers" }, 
       UseNamespaceFallback = false 
      } 
     ), 
     new MvcRouteHandler() 
    ) 
); 

Điều quan trọng là thêm mã thông báo UseNamespaceFallback. Điều này sẽ ngăn chặn các tuyến đường mặc định từ nhìn vào bất kỳ không gian tên khác.

Đây là hành vi không mong muốn và đó là vấn đề mà tôi không biết có ảnh hưởng đến dự án mà tôi đang thực hiện. Tôi sẽ liệt kê nó như là một vấn đề tại aspnet.codeplex.com. Tôi sẽ không gọi đây là một lỗi, nhưng hành vi chắc chắn xuất hiện để vi phạm các convetions cho định tuyến MVC.

+0

Điều này dường như không hoạt động, Bộ điều khiển vùng vẫn đang được kích hoạt thông qua/anarea/ Bộ điều khiển của tôi nằm trong không gian tên: TestAreaControllerAccessibleFromGlobal.Areas.MyArea.Controllers, và tôi đã thêm không gian tên 'TestAreaControllerAccessibleFromGlobal.Controllers' vào đăng ký tuyến mặc định (đây là nơi HomeController được đặt khi tạo dự án mới) – Duane

+0

Bạn có bất kỳ tuyến đường nào khác được xác định trong Global.asax.cs không? – counsellorben

+0

Không, chỉ có tuyến đường "Mặc định" với các sửa đổi bạn đã đề xuất trong câu trả lời: tuyến đường.MapRoute ( "Mặc định", // Tên tuyến đường "{controller}/{action}/{id}", // URL có thông số new {controller = "Home", action = "Index", id = UrlParameter.Optional}, // Tham số mặc định null, // constraints new [] {"TestAreaControllerAccessibleFromGlobal.Controllers"} // namespaces ); – Duane

0

Bạn phải áp dụng hạn chế không gian tên trong cả khu vực và tuyến đường chung.

Trong global.asax.cs bạn nên chỉnh sửa RegisterRoutes phương pháp chỉ như thế này

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
    routes.MapRoute(
     "Default", 
     "{controller}/{action}/{id}", 
     new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
     new string[] { "MyProject.Controllers" } 
    ); 
} 

Điều đó sẽ hạn chế "//" chỉ để không gian tên "MyProject.Controllers"

Nhưng cũng vì bạn sẽ phải áp dụng giới hạn không gian tên cho Khu vực để hạn chế "//" chỉ vào không gian tên "MyProject.Areas.MyArea.Controllers"

Vì vậy, bạn sẽ phải chỉnh sửa phương thức "RegisterArea" của "MyAreaAreaRegistration.cs" như dưới đây ("MyAreaRegistration.cs" tọa lạc tại 'Khu vực/thư mục/MyProject/MyArea'):

//Some default code stuff 
... 
public override void RegisterArea(AreaRegistrationContext context) 
{ 
    context.MapRoute(
     "MyArea_default", 
     "MyArea/{controller}/{action}/{id}", 
     new { action = "Index", id = UrlParameter.Optional }, 
     new string[] { "MyProject.Areas.MyArea.Controllers" } 
    ); 
} 

Hy vọng nó giúp !!

+0

Phải có một cái gì đó còn thiếu, tôi tạo ra một dự án MVC3 mới, thêm một khu vực mới gọi là MyArea, thực hiện những thay đổi trên mà bạn đề xuất. ... tức là // AreaHome gọi/MyArea/Controllers/AreaHomeController trong không gian tên "MyProject.Areas.MyArea.Controllers". – Duane

0

Bạn dường như được điều hướng đến /AnArea trong khi khu vực của bạn được gọi là MyArea vì vậy bạn nên tìm đến . /MyArea/ Sau đây là cách đăng ký tuyến đường khu vực trông giống như:.

context.MapRoute(
    "MyArea_default", 
    "MyArea/{controller}/{action}/{id}", 
    new { controller = "AnArea", action = "Index", id = UrlParameter.Optional } 
); 

AnArea là tên của bộ điều khiển, không khu vực này Nếu bạn muốn điều hướng đến một số bộ điều khiển của khu vực này bạn nên luôn luôn tiền tố của bạn url với MyArea là tên của khu vực.

+0

Tôi hiểu điều này, hành vi mà tôi tò mò là làm cách nào để dừng/AnArea/khỏi việc giải quyết bộ điều khiển AnArea của MyArea. Nó xuất hiện counsellerben đã tìm thấy một giải pháp, vì vậy cảm ơn anyways – Duane

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