2009-07-10 24 views
13

मैं नीचे प्रति यूआरएल के साथ एक MVC साइट लागू करने की आवश्यकता:ASP.net MVC कस्टम मार्ग हैंडलर/बाधा

  • CATEGORY1/उत्पाद/1/विकी
  • CATEGORY1/उत्पाद/2/विकी
  • CATEGORY1/उप-CATEGORY2/उत्पाद/3/विकी
  • CATEGORY1/उप-CATEGORY2/उप-CATEGORY3/उत्पाद/4/विकी
  • आदि आदि

जहां मिलान मानदंड यह है कि यूआरएल "विकी" के साथ समाप्त होता है।

दुर्भाग्य से नीचे कैच-ऑल केवल यूआरएल के अंतिम भाग में काम करता है:

routes.MapRoute("page1", // Route name 
       "{*path}/wiki", // URL with parameters 
       new { controller = "Wiki", action = "page", version = "" } // Parameter defaults 

मैं समय MVC तानाना विकल्पों के माध्यम से जाने के लिए नहीं किया है तो मैं सोच रहा था क्या संभव विकल्पों के लिए कर रहे हैं इसे लागू करना? कोई नमूना/उदाहरण बस शानदार होगा!

उत्तर

15

जैसा कि आपने बताया है, कैच-ऑल पैरामीटर केवल रूट के अंत में दिखाई दे सकता है - आपके द्वारा पोस्ट किया गया कोड एक रन-टाइम त्रुटि फेंक देगा और यदि आप दौड़ने का प्रयास भी करते हैं तो आपको मौत की पीली स्क्रीन दें आपका आवेदन।

कस्टम रूटिंग परिदृश्यों के निर्माण के लिए कई विस्तारशील बिंदुएं हैं। ये हैं - रूट, रूटबेस, और आईआरओटीएंडलर।

आप मार्गबेस को विस्तारित करके संभालने के लिए मार्गों की एक जेनरेट सूची बना सकते हैं। आम तौर पर आप एक कन्स्ट्रक्टर रखने के पैटर्न का पालन करेंगे जो संसाधन (नियंत्रक नाम) में लेता है, और उसके बाद इसे उन मार्गों की एक सूची निर्दिष्ट करता है, जिनके लिए यह जिम्मेदार था, और फिर इसे अपने वैश्विक.एक्सएक्स में मैप करना था।

public class MyRoute : RouteBase 
{ 
    private List<Route> _routes = new List<Route>(); 

    public MyRoute(string resource) 
    { 
     // make a Resource property, not shown in this example 
     this.Resource = resource; 

     // Generate all your routes here 
     _routes.Add(
      new Route("some/url/{param1}", 
      new McvRouteHandler { 
       Defaults = new RouteValueDictionary(new { 
        controller = resource, 
        action = actionName 
       }), 
      Constraints = new RouteValueDictionary() 
     ); 
     _routes.Add(...); // another new route 
    } 

    public override RouteData GetRouteData(HttpContextBase context) 
    { 
     foreach (var route in _routes) 
     { 
      var data = route.GetRouteData(context); 
      if (data != null) 
      { 
       return data; 
      } 
     } 
     return null; 
    } 

    public override VirtualPathData GetVirtualPath(RequestContext context, RouteValueDictionary rvd) 
    { 
     foreach (var route in _routes) 
     { 
      var path = route.GetVirtualPath(context, rvd); 
      if (path != null) 
      { 
       return path; 
      } 
     } 
     return null; 
    } 
} 

अपने मार्ग वर्ग के लिए, अपने Global.asax में एक routes.Add(new MyRoute("page1")); कार्य करें: यहाँ कुछ उदाहरण कोड आप से निर्माण कर सकते हैं।

यदि आपको और भी नियंत्रण की आवश्यकता है, तो आप उपरोक्त उदाहरण में दिखाए गए अनुसार अपने मार्गों के लिए आईआरओटीएंडलर() बनाने के बजाय, आईआरओटीएंडलर() बनाने के बजाय, अपने आईआरओटीएंडलर का उपयोग कर सकते हैं। यह आपको अनुरोध डेटा से नियंत्रक का चयन करने के तर्क को ओवरराइड करने की अनुमति देगा।

संपूर्ण ढांचा बेहद एक्स्टेंसिबल है, लेकिन आपको इसे ठीक से करने के लिए काफी कुछ सीखना होगा। अगर आप कर सकते हैं तो पकड़ने के सभी पैरामीटर का लाभ उठाने के लिए यदि संभव हो तो मैं बस आपके यूआरएल को फिर से व्यवस्थित करने का सुझाव दूंगा।

+1

लोचदार। रूटिंग (https://github.com/lokiworld/Elastic.Routing) अंतर्निहित एमवीसी रूटिंग को बढ़ाता है और आपको अपने मार्ग के किसी भी सेगमेंट में कैच का उपयोग करने की क्षमता प्रदान करता है साथ ही कुछ अन्य अच्छा वैकल्पिक सेगमेंट की तरह सामान। – BrutalDev

संबंधित मुद्दे