2009-06-21 17 views
11

मैं सोच रहा हूँ कि कैसे मैं इस तरह एक मार्ग नक्शा परिभाषित कर सकते हैं:asp.net MVC के जटिल मार्ग

{TreePath}/{Action}{Id} 

ट्री-मैप गतिशील इस तरह की एक डेटाबेस से भरी हुई है:

'Gallery/GalleryA/SubGalleryA/View/3' 

उत्तर

2

कर सकते हैं आप यूआरएल के आसपास स्विच करते हैं? यदि आप अपना {TreePath} पैरामीटर अंतिम पैरामीटर के रूप में बना सकते हैं, तो आप इसे आसानी से एक मार्ग से कर सकते हैं।

routes.MapRoute("TreeRoute", 
        "{Action}/{id}/{*TreePath}", 
        new TreeRouteHandler())); 

वाइल्डकार्ड मोहक पैरामीटर हालांकि पिछले पैरामीटर होना चाहिए।

अन्यथा, मुझे लगता है कि आप कई मानकों को परिभाषित करने के साथ अटक जाएंगे, एक TreeMap URL के प्रत्येक संभावित अनुभाग से मेल खाने के लिए।

ध्यान दें कि आप कभी भी दो रूटिंग पैरामीटर को उनके बीच कुछ शाब्दिक पाठ के बिना परिभाषित नहीं कर सकते हैं। दूसरे शब्दों में, आप {Action}/{Id} को परिभाषित कर सकते हैं, लेकिन आप कभी भी{Action}{Id} परिभाषित कर सकते हैं। रूटिंग इंजन के बारे में जानने का कोई तरीका नहीं है कि एक पैरामीटर समाप्त होता है और अगला मिलान पैटर्न के साथ शुरू होता है।

+0

मुझे लगता है कि कोई अन्य तरीका नहीं है। {एक्शन}/{आईडी}/{* ट्रीपाथ} बहुत सुंदर यूआरएल नहीं है। वैसे भी –

13

आप ऐसा करने के लिए एक कस्टम मार्ग हैंडलर बना सकते हैं।

routes.MapRoute(
    "Tree", 
    "Tree/{*path}", 
    new { controller = "Tree", action = "Index" }) 
     .RouteHandler = new TreeRouteHandler(); 

पेड़ हैंडलर, पथ पर लग रहा है कार्रवाई के रूप में अंतिम भाग के अर्क, और फिर नियंत्रक पर रीडायरेक्ट: वास्तविक मार्ग कैच-ऑल है। पथ भाग को पथ से भी हटा दिया जाता है। {Id} भाग जोड़ना सीधा होना चाहिए।

public class TreeRouteHandler : IRouteHandler 
{ 
    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     string path = requestContext.RouteData.Values["path"] as string; 

     if (path != null) 
     { 
      int idx = path.LastIndexOf('/'); 
      if (idx >= 0) 
      { 
       string actionName = path.Substring(idx+1); 
       if (actionName.Length > 0) 
       { 
        requestContext.RouteData.Values["action"] = actionName; 
        requestContext.RouteData.Values["path"] = 
         path.Substring(0, idx); 
       } 
      } 
     } 

     return new MvcHandler(requestContext); 
    } 
} 

आपका नियंत्रक तो काम करता है आप इसे उम्मीद करेंगे के रूप में:

public class TreeController : Controller 
{ 
    public ActionResult DoStuff(string path) 
    { 
     ViewData["path"] = path; 
     return View("Index"); 
    } 
} 

अब आप /Tree/Node1/Node2/Node3/DoStuff तरह URL को कॉल कर सकते हैं। जिस पथ को कार्रवाई मिलती है वह Node1/Node2/Node3

+0

वृक्ष शब्द अभी भी शोर है, धन्यवाद वैसे भी –

+0

एक कस्टम मार्ग हैंडलर निश्चित रूप से जाने का तरीका है यदि आपको गर्भ के काम को पसंद नहीं है। क्रिस के रूप में उल्लिखित "वृक्ष" नियंत्रक को स्पष्ट रूप से सेट करने की आवश्यकता नहीं है ... मुझे लगता है कि मूल विचार यह है कि आप कस्टम रूट हैंडलर के साथ कुछ भी कर सकते हैं। – Charlino

1

मैं एमवीसी के लिए नया हूं, लेकिन आवश्यकताओं में से एक यह विकल्प था। मैं एक vb-er हूं, इसलिए मुझे कोड बदलने में कुछ परेशानी थी, लेकिन इसे एक उदाहरण समाधान में योगदान देना चाहता था: www.proovit.com/Download/MvcApplication1.zip यह एक साधारण मानक एमवीसी प्रोजेक्ट है, मैंने कोड और बिन डीआईआर को छोड़ दिया, लेकिन आप उन्हें एक मानक परियोजना से कॉपी कर सकते हैं।

ओ, आपको ऑर्डर पेज के लिए इंडेक्स और ऐप/ट्रेड/ऑर्डर/व्यू के लिए टैग एप/ब्लै/ब्लै/ब्लै का उपयोग करना होगा।

1

आपके पास क्वेरीस्ट्रिंग के भीतर "लालची" भाग हो सकता है जब तक कि आप इसके बाद निश्चित भाग प्राप्त कर सकें, उदा।

/{*TreePath}/Edit/{id} 
/{*TreePath}/Action/{id} 

ध्यान दें कि कार्रवाई ऊपर मार्गों में चर क्योंकि लालची भागों कुछ शाब्दिक मूल्य (अन्य कि फ़ॉरवर्ड स्लैश) में बंद हो जाने की आवश्यकता नहीं है। मैं काम करूंगा यदि आप केवल अपने "पेड़" पर कुछ क्रियाएं करते हैं लेकिन यदि आपके पास कई कार्यवाही हैं तो प्रत्येक को अपनी मार्ग प्रविष्टि की आवश्यकता होगी क्योंकि बोझिल होगा।

यह बॉक्स से बाहर काम नहीं करेगा बल्कि एक कस्टम मार्ग की आवश्यकता है। आप कोड पर एक अच्छा लेखन पा सकते हैं जिसमें कोड here