2012-04-20 12 views
9

बहुत ही सरल सवाल है, लेकिन मैं इस बात के लिए एक जवाब नहीं मिल सका:एएसपी नेट MVC रूटिंग: केवल स्ट्रिंग आईडी के साथ यूआरएल

मैं डिफ़ॉल्ट {controller}/{action}/{id} मेरी Global.asax में पैटर्न की है।

मैं जरूरत भी कुछ मेरे जैसे www.example.com/microsoft या www.example.com/apple कुछ देना होगा, जबकि माइक्रोसॉफ्ट और सेब id डेटाबेस में संग्रहीत हैं। डिफ़ॉल्ट पैटर्न का उपयोग करना होगा: www.example.com/brands/detail/microsoft

कोई विचार कैसे पैटर्न होना चाहिए? मैंने कोशिश की: {id} और नियंत्रक और कार्रवाई को brands और detail पर सेट करें, यह मेरी ज़रूरतों को पूरा करने के लिए काम करता है लेकिन अन्य सभी पैटर्न को खंडित करता है।

धन्यवाद

+0

संभव नहीं लगता है, क्योंकि आप www.example.com/logple से www.example.com/apple नहीं बता सकते हैं कि पहले एक ब्रांड आईडी है और दूसरा नियंत्रक है नाम। जब तक आप अपना खुद का कस्टम रूटिंग प्रदाता नहीं लिखते और जांचें कि वह हिस्सा ब्रांड या नियंत्रक का नाम होना चाहिए या नहीं।लेकिन राउटर के लिए ज्यादातर मामलों के लिए यह बहुत जटिल होगा ... – xandy

उत्तर

5

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

routes.MapRoute("Default", // Route name 
        "{controller}/{action}/{id}", // URL with parameters 
        new { controller = "Home", action = "Index", id = "" }, 
        new { controller = new FromValuesListConstraint("Home", "Account","OtherOne") } 
       ); 

// to handle personalize user url 
routes.MapRoute("user","{url}", new {controller="Home",action="Profile",url = "" }); 

अब FromValuesListContraint नामक एक नया वर्ग जो IRouteConstraint

public class FromValuesListConstraint : IRouteConstraint 
{ 
    private string[] _values; 

    public FromValuesListConstraint(params string[] values) 
    { 
     this._values = values; 
    } 

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, 
    RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     // Get the value called "parameterName" from the 
     // RouteValueDictionary called "value" 

     string value = values[parameterName].ToString(); 

     // Return true is the list of allowed values contains 
     // this value. 

     for (int i = 0; i < _values.Length; i++) 
      if (SContains(_values[i], value, StringComparison.OrdinalIgnoreCase)) 
       return true; 

     return false; 
    }  

    public bool SContains(string source, string toCheck, StringComparison comp) 
    { 
     return source.IndexOf(toCheck, comp) >= 0; 
    } 
} 

से विरासत बनाने के घर में अपने Profile कार्रवाई विधि पैरामीटर मान पढ़ी है अनुरोध की www.yousite.com/apple तरह संभाल और से डेटा प्राप्त होगा अपने डेटाबेस।

public ActionResult Profile(string url) 
{ 
    //url variable will have apple or microsoft . You may get data from db and return a view now. 
} 

तो जब भी एक अनुरोध आता है, यह जाँच करेगा कि क्या यह एक नियंत्रक उपलब्ध है (जो आप अपने पहले मार्ग परिभाषा FromValuesListContraint वर्ग निर्माता में पारित कर दिया), तो उपलब्ध है अगर यह किसी और, कि मार्ग के लिए जाना होगा, यह दूसरे मार्ग के रूप में उल्लिखित सामान्य (डिफ़ॉल्ट) मार्ग के लिए जाएगा।

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

बस यह कह रहा है कि यह कुछ विशिष्ट अपवाद को पकड़ने और सामान्य अपवाद पर जाने जैसा काम करता है यदि उनमें से कोई भी पकड़ा नहीं जाता है! :) (समझने के लिए सिर्फ एक उदाहरण)

+0

अब तक मुझे यह विचार पसंद है, इसे लागू करने का प्रयास करेंगे। धन्यवाद – dritterweg

+0

यह अच्छा था..मैंने इस नए {कंट्रोलर = "होम", एक्शन = "इंडेक्स", आईडी = ""} जैसे मेरे रूटिंग यूआरएल को कार्यान्वित किया है: मैं यूआरएल प्राप्त कर सकता हूं: http: // localhost: 53045/accounts/chjnvd780 । क्या आपको पता है कि मेरे मॉडलस्टेट.इस्वालिद को त्रुटि क्यों मिल रही है? यह दिखा रहा है कि मूल्य 'chjnvd780' आईडी के लिए मान्य नहीं है। क्या आपको पता है कि इसे कैसे हल किया जाए? – Cherry

6

मैं एक बाधा है कि आईडी या तो अपने नियंत्रक से मेल नहीं कर सकते हैं या डेटाबेस में आईडी से एक मेल खाना चाहिए के साथ एक अलग मार्ग का सुझाव देते हैं। डिफ़ॉल्ट मार्ग से पहले इसे सूचीबद्ध करें ताकि योग्यता पूरी होने पर यह पहले मेल खाती हो।

एक निश्चित बाधा के लिए एक साधारण रेगेक्स का उपयोग उदाहरण उदाहरण के लिए, शायद आप आईआरओटीई कॉन्स्ट्रेन से प्राप्त कस्टम बाधा बनाना चाहते हैं जो मूल्यों को गतिशील रूप से सीमित करता है।

routes.MapRoute(
    "Brands", 
    "{id}", 
    new { controller = "brand", action = "detail" }, 
    new { id = "^(Microsoft)|(Apple)$" } 
); 

आप अधिक विचारों के लिए http://stephenwalther.com/blog/archive/2008/08/07/asp-net-mvc-tip-30-create-custom-route-constraints.aspx पर देख सकते हैं।

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