2013-02-14 28 views
6

Bir ASP.NET MVC yönlendirme sorusu var. Öncelikle, alanlarımın kurulumunu açıklamama izin verin. Oldukça basit.Çoklu ASP.NET MVC Yol Eşlemelerini Önlemek İçin

Areas 
| 
+--Foo 
    | 
    +--Controllers 
     | 
     +--BarController.cs 

Ben vs. "BarController.cs" adlı bir "Foo" denilen benim alanlarda klasör ve denetleyici Bar denetleyicisi "DoStuff1()", "DoStuff2()" adlı çeşitli yöntemler vardır sahip

web sitem aşağıdaki URL'ler kullanır:

/foo/bar/15 
/foo/bar/dostuff1 
/foo/bar/dostuff2 

ilk URL bir kimliği gerektirir ve görünümü ve modeli ile web sayfasını doldurmak için Bar denetleyicisi varsayılan Endeksi() yöntemini kullanır.

İkinci ve üçüncü URL'lerde, bunları jQuery ajax çağrıları için kullanıyorum. İşte

context.MapRoute(null, "Foo/Bar/DoStuff1", new 
{ 
    action = "DoStuff1", 
    controller = "Bar" 
}); 

context.MapRoute(null, "Foo/Bar/DoStuff2", new 
{ 
    action = "DoStuff2", 
    controller = "Bar" 
}); 

context.MapRoute(null, "Foo/Bar/{id}", new 
{ 
    action = "Index", 
    controller = "Bar" 
}); 

Sorunum oluşturduğunuz her yeni denetleyici yöntemi için, ben alan registrion dosyasında başka rota eşleme eklemek zorunda olmasıdır alanım registrion gelen kodudur. Ben yöntemini DoStuff3() eklerseniz Örneğin, ben alan tescile bu eklemeniz gerekir:

context.MapRoute(null, "Foo/Bar/DoStuff3", new 
{ 
    action = "DoStuff3", 
    controller = "Bar" 
}); 

O değil ben yukarıda belirtilen URL'ler işlemek için genel bir rota eşlemesi nasıl oluşturabilirim Yeni kontrol yöntemleri için alan kayıt dosyasına yeni eklemeler mi gerekiyor?

+0

Bu ne arıyorsunuz? http://stackoverflow.com/questions/2682170/asp-net-mvc-areas-how-to-hide-area-name-in-url –

cevap

3

Denetleyici eylemini çıkarabilirsiniz.

böyle URL'yi yazın: siz de denetleyici çekin ve bu durumda

"Foo/{controller}/{action}" 

yazabilir, Ek

"Foo/Bar/{action}" 

, action = "Index" "Index" varsayılan değer sağlar Hiçbir eylem parametresi sağlanmamışsa.

Bu durumda, "Foo/Bar/{action}" ve "Foo/Bar/{id}" arasındaki bağlantıları kaldırmanız gerekir. Eşleme sırayla yapıldığından, önce id rotasını koymak ve id parametresine bir constraint sayısal parametresi eklemek isteyeceksiniz. Bu, geçerli sayısal kimliklerin eşleşmesine ve sonraki adlara geçmek için işlem adlarına izin verir. Sizin iki yolları şu şekilde görünecektir:

context.MapRoute(null, "Foo/Bar/{id}", new 
{ 
    action = "Index", 
    controller = "Bar" 
}, 
new { id = @"\d+" }); 

context.MapRoute(null, "Foo/Bar/{action}", new 
{ 
    action = "Index", //optional default parameter, makes the route fall back to Index if no action is provided 
    controller = "Bar" 
}); 
+0

Sayısal kısıtlama eklemekle ilgili bir makale buldum. Sorudaki güncellenmiş bölümüme bakın. – Halcyon

+0

Aslında, bu değişikliği geri aldım. Çözüm/cevap, quesiton'a düzenlenmemelidir. Soru sadece soruyu içermelidir. Cevaplar cevap olarak gönderilmelidir (ve cevabımda bu makaleye zaten bağlandım). – yoozer8

0

MVC şablonları ile gelen varsayılan yönlendirme gerekli rota yapılandırmaları çoğu için iyidir.

routes.MapRoute(
        name: "Default", 
        url: "{controller}/{action}/{id}", 
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
      );