2010-07-24 8 views
6

Şu anda ASP.NET MVC 2.0 kullanan bir e-mağazasında çalışıyorum. Zaten bunun çoğunu çalıştırdım, ama beni rahatsız eden kısım yönlendirme.MVC 2.0 bir e-mağazadaki kategori isimleri için dinamik yönlendirme

routes.MapRoute(
      "Category", 
      "{alias}/{pageNumber}", 
      new { controller = "Categories", action = "Browse", pageNumber = 1 }); 

Ama bu İsterdim sadece olandan çok fazla yakalar: Şimdiye kadar kullanarak çözmek mümkün oldum

http://mystore.somewhere/my-category-1/

: Bunu istiyorum. özünde ben

foreach (var c in Categories) 
     { 
      routes.MapRoute(
       c.Name, 
       "{" + c.Alias + "}/{action}/...anything else", 
       new { controller = "Category", action = "Index" }).RouteHandler = new CateegoryRouteHandler(c); 
     } 
yapıyor olurdum böylece

bu sitenin etrafında bazı soru ve cevaplarla okuduktan sonra, programlama benim kategorilerin her biri için bir rota kayıt beni gerektirecek bir özellikle ilginç bir çözüm buldu

Ne düşünüyorsun? Bu iyi bir fikir mi? Muhtemelen yaklaşık 200 kategoriye sahip olacağım, yönlendirme tablosunda olması gereken çok fazla "rota" var mı? Başka bir çözüm önerir misin?

Teşekkürler.

Selamlar, Anže

cevap

5

dinamik kısıtlaması sahip tek yolu daha zarif bir çözüm olabilir. Sadece kategorilerinize uyan bir kısıtlama kurmanız yeterli.

 routes.MapRoute(
     "Category", 
     "{alias}/{pageNumber}", 
     new { controller = "Categories", action = "Browse", alias = UrlParameter.Optional, pageNumber = 1 }, 
     new { alias = new CategoryMatchConstraint() }); 


public class CategoryMatchConstraint : IRouteConstraint 
{ 
     public bool Match(HttpContextBase httpContext, 
         Route route, 
         string parameterName, 
         RouteValueDictionary values, 
         RouteDirection routeDirection) 
     { 
      var category = values.Values[parameterName] as string; 
      if (string.IsNullOrEmpty(category)) 
      { 
       return false; 
      } 
      using (var db = new MyDatabaseContext()) 
      { 
       return db.Categories.Any(c => c.Name == category); 
      } 
     } 
} 
+0

Ah harika! Bu sadece bir çekicilik gibi çalıştı! Rota kısıtlamaları hakkında bilmiyordum. Çok teşekkürler! –

+0

Merhaba @tvanfosson, 50K kategorileri varsa performans hakkında ne dersiniz? Bildiğim kadarıyla bir önbellek tablosu önbelleği veya bunun gibi bir şey var ama her durumda db'den kontrol ediyor. –

İlgili konular