2015-08-19 25 views
6

Sau khi cài đặt Visual Studio 2015 trên nhiều máy, thứ tự các tuyến đường trong sơ đồ định tuyến được chọn bởi AreaRegistration.RegisterAllAreas() dường như đã đảo ngược chính nó.Tại sao thứ tự các khu vực trong RegisterAllAreas thay đổi với Visual Studio 2015?

Tôi có 3 khu vực trong ứng dụng của mình, mỗi khu vực trong số đó có triển khai AreaRegistration riêng và đăng ký tuyến đường cụ thể của riêng mình.

Trên máy chỉ với Visual Studio 2013, danh sách các tuyến đường (theo báo cáo của các plugin RouteDebugger) là:

SomeArea/{controller}/{action}/{id} 
DifferentArea/{controller}/{action}/{id} 
{controller}/{action}/{id} 

Trên máy với Visual Studio 2015 (và cùng một mã nguồn chính xác)

{controller}/{action}/{id} 
SomeArea/{controller}/{action}/{id} 
DifferentArea/{controller}/{action}/{id} 

Điều này đã gây ra lỗi 404 do tuyến đường tổng quát hơn giờ đây phù hợp với các tuyến đường mà trước đó chưa có. Tại sao thứ tự các khu vực được quét cho các lớp AreaRegistration của họ thay đổi khi cài đặt một phiên bản mới của Visual Studio?

Trả lời

0

Tôi có thể sai, nhưng tôi sẽ mạo hiểm để đoán rằng bạn đã đảo ngược thứ tự của AreaRegistration.RegisterAllAreas()RouteConfig.RegisterRoutes(RouteTable.Routes) trong cấu hình của bạn và điều này không liên quan gì đến phiên bản Visual Studio.

Nếu cấu hình của bạn là

AreaRegistration.RegisterAllAreas(); 

// Followed by 

RouteConfig.RegisterRoutes(RouteTable.Routes); 

Sau đó, tuyến đường của bạn sẽ phù hợp theo thứ tự

SomeArea/{controller}/{action}/{id} 
DifferentArea/{controller}/{action}/{id} 
{controller}/{action}/{id} 

Nếu cấu hình của bạn là

RouteConfig.RegisterRoutes(RouteTable.Routes); 

// Followed by 

AreaRegistration.RegisterAllAreas(); 

Sau đó, tuyến đường của bạn sẽ phù hợp theo thứ tự

{controller}/{action}/{id} 
SomeArea/{controller}/{action}/{id} 
DifferentArea/{controller}/{action}/{id} 

Các toàn bộ .NET framework định tuyến là thứ tự nhạy cảm không phân biệt nếu các tuyến đường được cấu hình như các khu vực, các thuộc tính tuyến đường, tùy chỉnh Route hoặc RouteBase lớp con, các tuyến đường WebAPI, hoặc cấu hình thông qua MapRoute hoặc MapPageRoute. Vì vậy, điều quan trọng là mỗi phần được đăng ký theo đúng thứ tự để có được kết quả chính xác.

Cũng có thể cấu hình tuyến đường của bạn không hợp lệ ở địa điểm đầu tiên, nhưng để cho bạn biết rằng bạn phải đăng cấu hình tuyến đường của mình.

+1

Không. Tôi đã thử nghiệm kịch bản trên các máy riêng biệt với cùng một mã cơ sở. Máy có cài đặt VS 2015 có kết quả khác với máy không cài đặt VS 2015. – Mathew

+0

Vì vậy, hãy đăng tuyến đường và cấu hình định tuyến của bạn. – NightOwl888

2

Buổi sáng,

Điều tương tự ở đây. Tôi đã cài đặt VS 2015, đã mở giải pháp, được xây dựng và điều gì đó đã xảy ra với Định tuyến.

Sau đó tôi đã cài đặt RouteDebugger và có thể thấy rằng, giống như bạn, thứ tự Định tuyến khu vực đã thay đổi.

tôi đã tìm kiếm một chút và thấy điều này:

http://www.c-sharpcorner.com/UploadFile/c60c74/net-mvc-area-registration-sequence/

Rõ ràng thứ tự của các yếu tố Compile bên trong tập tin csproj là thứ tự mà tập tin được gửi đến trình biên dịch và do đó, thứ tự mà khu vực các tuyến đường sẽ được đăng ký.

Thật không may, tôi nghĩ rằng điều này là hợp lệ cho đến khi VS 2013. Tôi thậm chí đã gọi trình biên dịch (CSC.EXE) từ cả hai cửa sổ đầu ra và so sánh tất cả các đối số từng người một. Không có gì khác ở đó vì vậy tôi đoán là bản thân trình biên dịch đã thay đổi bằng cách nào đó.

tôi sẽ nêu vấn đề này với Microsoft nhưng cho đến lúc đó tôi thấy cách dễ dàng này đăng ký bằng tay các lãnh vực này:

http://forums.asp.net/t/1642939.aspx

Hy vọng nó giúp.

Miquel

+0

Tôi hy vọng microsoft được trả lại cho bạn về điều này; tôi chỉ chạy vào cùng một vấn đề này. Cảm ơn các liên kết theo dõi. –

+0

Mã trong bài viết trên diễn đàn đã giúp chúng tôi. Cảm ơn! –

4

mỗi giải pháp được liệt kê ở đây: http://forums.asp.net/t/1642939.aspx

Tôi lấy nó và làm nó trở thành một tốt hơn ... giúp bạn khỏi phải liệt kê một cách rõ ràng tất cả các lớp học cho gọi chung:

public static void RegisterArea(Type t, RouteCollection routes, object state) 
    { 
     AreaRegistration registration = (AreaRegistration)Activator.CreateInstance(t); 
     AreaRegistrationContext context = new AreaRegistrationContext(registration.AreaName, routes, state); 
     string tNamespace = registration.GetType().Namespace; 
     if (tNamespace != null) 
      context.Namespaces.Add(tNamespace + ".*"); 
     registration.RegisterArea(context); 
    } 

    protected void Application_Start() 
    { 
     //AreaRegistration.RegisterAllAreas(); 

     Assembly.GetExecutingAssembly().GetTypes().Where(t => t.IsSubclassOf(typeof(AreaRegistration))) 
      .OrderBy(r=> r.FullName) 
      .ToList() 
      .ForEach(r=> RegisterArea(r, RouteTable.Routes, null)); 

     .... 

Hy vọng điều này sẽ giúp bạn tiết kiệm thời gian.

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