2010-07-24 7 views
6

में श्रेणी नामों के लिए एमवीसी 2.0 गतिशील रूटिंग मैं वर्तमान में एएसपी.नेट एमवीसी 2.0 का उपयोग कर ई-स्टोर पर काम कर रहा हूं। मुझे पहले से ही इसमें से अधिकतर मिल रहा है और चल रहा है, लेकिन जो हिस्सा मुझे परेशान कर रहा है वह रूटिंग है।ई-स्टोर

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

अब तक मैं का उपयोग करके इसे हल करने में सक्षम किया गया है:: मैं इस चाहते

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

लेकिन इस तरह से भी मैं चाहता हूँ बस क्या की तुलना में बहुत फैल जाती है।

कुछ सवाल और इस साइट के लिए उत्तर के माध्यम से पढ़ने के बाद, मैं एक खासकर दिलचस्प समाधान है कि मुझे आवश्यकता होगी प्रोग्राम के मेरी श्रेणियों में से प्रत्येक के लिए एक मार्ग रजिस्टर करने के लिए मिल गया संक्षेप में मैं

foreach (var c in Categories) 
     { 
      routes.MapRoute(
       c.Name, 
       "{" + c.Alias + "}/{action}/...anything else", 
       new { controller = "Category", action = "Index" }).RouteHandler = new CateegoryRouteHandler(c); 
     } 
कर रहा था

आपको क्या लगता है? यह एक अच्छा विचार है? मुझे शायद लगभग 200 श्रेणियां मिलेंगी, क्या यह रूटिंग टेबल में बहुत अधिक "मार्ग" है? क्या आप एक और समाधान सुझाएंगे?

धन्यवाद।

सादर, Anže

उत्तर

5

एक गतिशील बाधा के साथ एक एकल मार्ग एक और अधिक सुरुचिपूर्ण समाधान हो सकता है। बस एक बाधा स्थापित करें जो केवल आपकी श्रेणियों से मेल खाती है।

 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

ओह महान! यह सिर्फ एक आकर्षण की तरह काम किया! मार्ग की बाधाओं के बारे में नहीं पता था। आपका बहुत बहुत धन्यवाद! –

+0

हैलो @ टवानफॉसन, यदि 50 के श्रेणियां हैं तो प्रदर्शन के बारे में क्या। जहां तक ​​मुझे पता है कि एक रूट टेबल कैशिंग या ऐसा कुछ है लेकिन किसी भी मामले में यह डीबी से जांचता है। –