2012-11-30 25 views
7

Ben son asp.net mvc 4 mimarisini kullanarak çalışan bazı yönlendirme kısıtlamaları almaya çalışıyorum. App_Start altında RouteConfig.cs adlı bir dosya var.nasıl ASP.net MVC 4 RouteConfig.cs içinde kısıtlamaları kullanılır?

aşağıda benim örnekten kısıtlamalar bölümünü kaldırırsanız, url çalışır. Ancak, URL’nin her şeye uymaması için bazı kısıtlamalar eklemem gerekiyor.

çalışması gerekir:/video/derecelendirme/1

işe shold değil:/video/2458/Yazı-Goes-İşte Bu benim ne var

:

//URL: /videos/rating/1 
routes.MapRoute(
    name: "Videos", 
    url: "videos/{Sort}/{Page}", 
    defaults: new { controller = "VideoList", action = "Index", Sort = UrlParameter.Optional, Page = UrlParameter.Optional }, 
    constraints: new { Sort = @"[a-zA-Z]", Page = @"\d+"} 
); 

cevap

11

Eğer Aynı rotada birden fazla isteğe bağlı parametreyi istemek, sorunlarınızla karşılaşacaksınız çünkü urlleriniz ikinciyi kullanmak için her zaman ilkini belirtmelidir. Kısıtlamaları kullanmanızın, parametreleri değerlendirmesini engellememesi nedeniyle, bu yolla eşleşmesi başarısız olur.

örneğin bu atın: /videos/3

bu maç için çalışıyor, bu videoları bulur ve "Tamam, ben hala maç" der. Ardından Sırala ve sonraki değeri 3 olan bir sonraki parametreye bakar, sonra kısıtlamaya karşı kontrol eder. Kısıtlama başarısız olur ve "OPPS, bu rotayla eşleşmiyorum" der ve sonraki rotaya geçer. Sıralama parametresi tanımlanmayan sayfayı belirtmek için 2 yol tanımlamanız gerekir.

//URL: /videos/rating/1 
routes.MapRoute(
    name: "Videos", 
    url: "videos/{Sort}/{Page}", 
    defaults: new { controller = "VideoList", action = "Index", Page = UrlParameter.Optional }, 
    constraints: new { Sort = @"[a-zA-Z]+", Page = @"\d+"} 
); 

//URL: /videos/1 
routes.MapRoute(
    name: "Videos", 
    url: "videos/{Page}", 
    defaults: new { controller = "VideoList", action = "Index", Sort = "the actual default sort value", Page = UrlParameter.Optional }, 
    constraints: new { Page = @"\d+"} 
); 

ben mümkün olduğunda öncelikle en spesifik yolları koymak ve spesifik az ile sona, ancak bu durumda sipariş çünkü kısıtlamaları önemli olmamalı. Ne özgü kastım sen ilk rotada tür tanımlamanız gerekir Dolayısıyla bu durumda en değerleri tanımlanır ve sadece sayfa parametresi ile rota daha spesifiktir böylece de, sayfa tanımlayabilir.

+0

Teşekkürler, bu birkaç sorunu gidermeye yardımcı oldu. – Maddhacker24

1

Benim girişi belki biraz geç, ama yine basit şeyler tutmak answers.To ararken diğerleri için i uygulama seçiminize bağlı olarak benim RoutesConfig dosyası

routes.MapRoute(
    name: "Videos", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "VideoList", action = "Index", id="" }, 
    constraints: new { id = @"\d+"} 
    ); 

aşağıdaki kullanırsınız, kimliği olabilir UriParameter .Optional, ancak bu senaryoda id = "" olacak, çünkü çalışma zamanında bir string/int geçireceğiz.

Bu stil her zaman kontrolör örn VideoListController sınıfı ile sona kongre kontrolör sınıfları tarafından akılda tutulması gereken http://www.asp.net/mvc/overview/older-versions-1/controllers-and-routing/creating-a-route-constraint-cs

Bir şeyden kabul edilmiştir. Bu sınıf aşağıdaki yöntemi

public ActionResult Index(string id) 
{ 
    // note this maps to the action 
    // random implementation 
    ViewBag.Message=id; 
    View() 
} 

// bu yaklaşım hala herhangi bir dize ... yalnızca tamsayılar eşleştirmek için maçları not Endeksi yöntemi yeniden yazılması için gelmiştir

public ActionResult Index(int id) 
{ 
    // note this maps to the action 
    ViewBag.Message=id; 
    View() 
} 
içeren kontrolör klasörü altında listelenmiş olmalıdır

Sonuç olarak, bu yaklaşım VideoList/Index/12 için değil VideoList/Index/somerandomtext Artık çalışma sırasında bir hata atar koyarak üzerine çalışır. Bu, hata sayfaları kullanılarak çözülebilir. Umarım bu yardımcı olur. Oldukça kullanışlısa oy verin.

İlgili konular