2008-12-22 9 views
10

मैं "गतिशील" रूटिंग बनाने के लिए एक दृष्टिकोण के साथ आने की कोशिश कर रहा हूं। मेरा मतलब है, बिल्कुल, यह है कि मैं इसे सीधे मैप किए जाने के बजाय प्रत्येक हिट के लिए नियंत्रक और मार्ग की कार्रवाई को असाइन करने में सक्षम होना चाहता हूं।एएसपी.नेट एमवीसी - "गतिशील" रूटिंग के लिए सर्वश्रेष्ठ दृष्टिकोण

उदाहरण के लिए, एक मार्ग इस "पथ/{ऑब्जेक्ट}" जैसा दिख सकता है और जब वह पथ मारा जाता है, तो एक लुकअप उचित कॉलर/कॉल करने के लिए क्रिया प्रदान करता है।

मैंने एक कस्टम मार्ग हैंडलर बनाने के लिए तंत्र की खोज करने की कोशिश की है, लेकिन इस समय दस्तावेज़ीकरण/खोज योग्यता थोड़ा सा छायादार है (मुझे पता है, इसकी बीटा - मुझे और उम्मीद नहीं होगी)। हालांकि, मुझे यकीन नहीं है कि क्या यह भी सबसे अच्छा दृष्टिकोण और शायद एक नियंत्रक फैक्ट्री या यहां तक ​​कि एक डिफ़ॉल्ट नियंत्रक/क्रिया है जो सभी मैपिंग करता है, जाने का सबसे अच्छा मार्ग (कोई इरादा नहीं) हो सकता है।

किसी भी सलाह की सराहना की जाएगी।

+1

कृपया इस छोटे से मार्गदर्शन पर एक नज़र डालें: [MVC .Net रूटिंग] (http://stackoverflow.com/questions/379558/mvcnet-routing#379823), सेक्शन ** विकल्प 3 ** - यह वर्णन करता है कि आपकी कस्टम अनुरोध प्रसंस्करण श्रृंखला कैसे बनाएं। – maxnk

उत्तर

3

आप हमेशा सभी सिंटैक्स को पकड़ सकते हैं (मुझे पता नहीं है कि नाम उचित है या नहीं)।

रूट: routeTable.MapRoute( "Path", "{*path}", new { controller = "Pages", action = "Path" });

नियंत्रक कार्रवाई के रूप में परिभाषित किया गया है: public ActionResult Path(string path)

नियंत्रक आप एक रास्ता होगा के लिए कार्रवाई में, तो बस यह गिरा और विश्लेषण करने के लिए किया है।

एक और नियंत्रक को कॉल करने के लिए आप एक RedirectToAction (मुझे लगता है कि यह अधिक उचित तरीका है) का उपयोग कर सकते हैं। पुनर्निर्देशन के साथ आप इसके लिए एक स्थायी पुनर्निर्देशन स्थापित कर सकते हैं। या ऐसे ही एक कुछ का उपयोग करें:

internal class MVCTransferResult : RedirectResult 
    { 
     public MVCTransferResult(string url) : base(url) 
     { 
     } 
     public MVCTransferResult(object routeValues) 
       : base(GetRouteURL(routeValues)) 
     { 
     } 

     private static string GetRouteURL(object routeValues) 
     { 
      UrlHelper url = new UrlHelper(
       new RequestContext(
         new HttpContextWrapper(HttpContext.Current), 
         new RouteData()), 
         RouteTable.Routes); 
      return url.RouteUrl(routeValues); 
     } 

     public override void ExecuteResult(ControllerContext context) 
     { 
      var httpContext = HttpContext.Current; 

      // ASP.NET MVC 3.0 
      if (context.Controller.TempData != null && 
       context.Controller.TempData.Count() > 0) 
      { 
       throw new ApplicationException(
        "TempData won't work with Server.TransferRequest!"); 
      } 
      // change to false to pass query string parameters 
      // if you have already processed them 
      httpContext.Server.TransferRequest(Url, true); 

      // ASP.NET MVC 2.0 
      //httpContext.RewritePath(Url, false); 
      //IHttpHandler httpHandler = new MvcHttpHandler(); 
      //httpHandler.ProcessRequest(HttpContext.Current); 
     } 
    } 

हालांकि इस विधि आईआईएस या एक आईआईएस एक्स्प्रेस Casinni पर चलाने के लिए आवश्यकता होती है एक Server.Transfer विधि का समर्थन नहीं कर रहा है

+0

क्या आपको पता है कि ट्रांसफररवेस्ट को कॉल करने से पहले हमें टेम्पपडाटा में डेटा की जांच क्यों करनी है? – yurart