2015-08-19 16 views
6

Visual Studio 2015'i birden fazla makineye yükledikten sonra, AreaRegistration.RegisterAllAreas() tarafından alınan routemap içindeki rotaların sırası tersine dönmüş gibi görünüyor.RegisterAllAreas'taki alanların sırası neden Visual Studio 2015 ile değişti?

Uygulamamda her biri kendi AreaRegistration uygulamasına sahip olan ve kendi özel yolunu kaydeden 3 alanım var.

sadece Visual Studio 2013 ile makinelerde

, (RouteDebugger eklentisi tarafından bildirildiği gibi) yollarının listesi vardı: Visual Studio 2015 (ve aynı kaynak kodu)

sahip makinelerinde

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

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

Bu, 404 hatasına neden oldu, çünkü daha genel rota, daha önce yapmadığı rotaları eşleştiriyordu. Neden Alanlar Kayıt sınıfları için taranan alanların sırası, Visual Studio'nun yeni bir sürümünün yüklenmesiyle değişiyor?

cevap

0

Hatalı olabilirim, ancak yapılandırmanızda AreaRegistration.RegisterAllAreas() ve RouteConfig.RegisterRoutes(RouteTable.Routes) sırasını tersine çevirdiğinizi ve bunun Visual Studio sürümü ile ilgisi olmadığını tahmin etmek için girişimde bulunacağım. Yapılandırma

AreaRegistration.RegisterAllAreas(); 

// Followed by 

RouteConfig.RegisterRoutes(RouteTable.Routes); 

ise yapılandırma Sonra yolları sırayla

içinde maç olacak

RouteConfig.RegisterRoutes(RouteTable.Routes); 

// Followed by 

AreaRegistration.RegisterAllAreas(); 

ise

Sonra yolları sırayla

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

içinde maç olacak yolları alanlar, rota nitelikler, özel Route veya RouteBase alt sınıfları, WebAPI yolları olarak yapılandırılmış veya MapRoute veya MapPageRoute yapılandırılmadıklarını eğer

tüm NET yönlendirme çerçevesibakılmaksızın sipariş duyarlıdır. Bu nedenle, doğru sonuca ulaşmak için her parçanın doğru sırada kaydedilmesi önemlidir.

Ayrıca, rota yapılandırmanızın ilk etapta geçerli olmadığı, ancak rota yapılandırmanızı göndermeniz gerektiğini bildirmek için de mümkündür.

+1

Nope. Senaryoyu, aynı kod tabanına sahip ayrı makinelerde test ettim. VS 2015 yüklü olan makinelerin, VS 2015 yüklü olmayan makinelere farklı bir sonucu vardır. – Mathew

+0

Yani rotalarınızı ve yönlendirme yapılandırmanızı gönderin. – NightOwl888

2

Sabah,

Burada da aynı şey. VS 2015'i kurdum, çözümü açtım, Routing'e bir şey oldu.

Daha sonra RouteDebugger'ı yükledim ve sizin gibi Alan yönlendirme sırasının değiştiğini görebiliyordum.

Biraz arandı ve bu bulundu: Anlaşılan csproj dosyasının içinde Derleme elemanlarının sırası dosyaları dolayısıyla derleyici gönderilen ve sırası vardır

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

sırası Alanlar içinde rotalar kaydedilecek.

Ne yazık ki, bu VS 2013'e kadar geçerli olduğunu düşünüyorum. Hatta her iki çıkış penceresinden derleyici (CSC.EXE) çağrısı aldım ve tüm argümanları tek tek karşılaştırdım. Orada farklı bir şey yok, bu yüzden benim tahminim, derleyicinin bir şekilde değişmiş olması.

Ben Microsoft ile bu yükseltir ama o zamana kadar elle Alanları kayıt bu kolay bir yol bulundu:

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

yardımcı olur Umut.

Miquel

çözümü Başına
+0

Umarım microsoft bu konuda size geri döner; Sadece aynı konuya girdim. Takip bağlantıları için teşekkürler. –

+0

Forumlardaki makalenin kodu bize yardımcı oldu. Teşekkürler! –

4

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

kabul ettim ve daha iyi bir ... açıkça jenerik çağrı için tüm sınıfları listelemek için gerek kalmaz yaptım:

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)); 

     .... 

Bu birileri bir süreliğine kurtarır.

İlgili konular