2010-02-01 6 views
16

गतिशील यूआरएल बनाने के लिए कैसे/जैसे लिंक: www.restaurant.com/restaurant/restaurant-name-without-some-characters-like-space-coma-etc/132asp.net mvc में url में पृष्ठ शीर्षक कैसे जोड़ें? (यूआरएल पीढ़ी)

क्या कर रहे हैं कीवर्ड मैं इस विषय पर कुछ लेखों को Google पर उपयोग करने के लिए उपयोग कर सकता हूं? (एएसपीएनटी एमवीसी के अंदर इस प्रकार के यूआरएल को कैसे ग्रीन्रेट और संभाल लें)

कुछ प्रश्न हैं: लिंक कैसे उत्पन्न करें? (डीबी में स्टोर स्लग?) रीडायरेक्ट या नहीं अगर स्लग कैननिकल नहीं है?

संपादित करें: जाहिरा तौर पर वे कहा जाता है मल

उत्तर

2

एक तरह से यह करने के लिए

string cleanString = originalString.ToLower().Replace(" ", "-"); // ToLower() on the string thenreplaces spaces with hyphens 
cleanString = Regex.Replace(cleanString, @"[^a-zA-Z0-9\/_|+ -]", ""); // removes all non-alphanumerics/underscore/hyphens 

अब आप पास कर सकते हैं अपने स्ट्रिंग पर पीछा कर रहा है cleanString ActoinLink में (शीर्षक, नाम आदि के लिए)/Url.Action पैरामीटर और यह बहुत अच्छा काम करेगा।

पैटर्न से http://snipplr.com/view/18414/string-to-clean-url-generator/

लिया गया था मैं Regex तर्ज पर% नहीं 100 हूँ, अगर कुछ Regex नायक झंकार और एक बेहतर एक है कि बहुत अच्छा होगा की पेशकश कर सकते हैं। रेगेक्स का परीक्षण करने से, यह रिक्त स्थान से मेल नहीं खाता है, लेकिन यह कोई समस्या नहीं होनी चाहिए क्योंकि पहली पंक्ति हाइफ़न के साथ सभी रिक्त स्थान को प्रतिस्थापित करती है।

अद्यतन:

इस कोड का उपयोग करने के लिए आपको अतिरिक्त पैरामीटर स्वीकार करने के लिए अपने मार्गों सेटअप की जरूरत है।

हम एक उदाहरण के रूप में एक ब्लॉग लेख शीर्षक का उपयोग करेंगे।

 routes.MapRoute(
      "",            // Route name 
      "View/{ID}/{Title}",       // URL with parameters 
      new { controller = "Articles", action = "View"} // Parameter defaults 
     ); 

अपने ASP.NET MVC दृश्य में, आप उसके बाद निम्न कर सकते हैं: पिछले उदाहरण में

<%= Html.ActionLink("View Article", "View", "Articles", new { ID = article.ID, Title = Html.SanitizeTitle(article.Title) }, null) %> 

, मैं एक HTML helper रूप SanitizeTitle का उपयोग करें।

public static SanitizeTitle(this HtmlHelper html, string str) 
{ 
    string cleanString = originalString.ToLower().Replace(" ", "-"); // ToLower() on the string thenreplaces spaces with hyphens 
    cleanString = Regex.Replace(cleanString, @"[^a-zA-Z0-9\/_|+ -]", ""); // removes all non-alphanumerics/underscore/hyphens 
    return cleanString; 
} 
+0

मुझे कोई regex नायक हूँ के साथ सभी गैर शब्द अक्षर में बदलें लेकिन मुझे लगता है कि यह बेहतर होगा: इनपुट = Regex.Replace (इनपुट, @ "[| \\ /]", "-"); // 0- इनपुट = Regex.Replace (इनपुट, @ "[^ a-zA-Z0-9 -_। ~]", "") के साथ "ब्रेकिंग" वर्ण बदलें। // इनपुट = इनपुट.Trim (नया [] {'-', '_', '।', '~'} के साथ शेष गैर-सुरक्षित (आरएफसी 3 9 86) वर्णों को बदलें।) ToLower(); // ट्रिम अग्रणी या पिछला गैर-अल्फान्यूमेरिक वर्ण और लोअरकेस – JohannesH

+1

बकवास में कनवर्ट करें ... टिप्पणियों में कोई लाइन-ब्रेक नहीं। – JohannesH

6

आपको निम्नानुसार कुछ उपयोग करना होगा।

Routes.MapRoute(
    "Post", 
    "posts/{id}/{*title}", 
    new { controller = "Posts", action = "view" } 
); 

और एक सरल विस्तार विधि:

public static class UrlExtensions 
{ 

    public static string ResolveSubjectForUrl(this HtmlHelper source, string subject) 
    { 
     return Regex.Replace(Regex.Replace(subject, "[^\\w]", "-"), "[-]{2,}", "-"); 
    } 

} 
+0

"{* title}" में "*" क्या है? – Ante

+0

यह कैच-ऑल पैरामीटर है। आईडी के बाद सब कुछ शीर्षक है। इसके अलावा यह अंतिम पैरामीटर भी वैकल्पिक बनाता है। –

+1

आप कहां और कहां UrlExtensions कहते हैं। ResolveSubjectForUrl विधि? – Chris

2

मैं सिर्फ इतना स्लग पैदा करने के लिए के बारे में पर एक relevant question आज पूछा, उर्फ ​​/ एक शीर्षक slugify।

स्लग के साथ एक यूआरएल लाने के दौरान, आप या तो ID (और अन्य आवश्यक तर्क) और slug दोनों ले सकते हैं और बस स्लग को अनदेखा कर सकते हैं।

public ActionResult Foobar(int id, string slug) 
{ 
    //-- Do Something 
} 

या अधिक सुरुचिपूर्ण, उपयोग मानचित्र मार्ग अपने यूआरएल के पीछे स्ट्रिंग trialing ध्यान न दें और Foobar(int id) को मैप करने के।

4

मैंने हमेशा डेटाबेस में स्लग संग्रहीत किए हैं, साथ ही उनके द्वारा संदर्भित किसी भी इकाई का संदर्भ दिया जाएगा। तो ब्लॉग पोस्ट के लिए, आपके पास "पोस्ट" तालिका में "स्लग" फ़ील्ड होगा।

एएसपी.NET एमवीसी में इसे संभालने के लिए आसान है - आप केवल एक नियमित मार्ग का उपयोग करें जो एक पैरामीटर में स्लग कैप्चर करेगा (संभवतः यहां तक ​​कि केवल {id} का उपयोग करके), और फिर आपका नियंत्रक स्लग को देखेगा डेटाबेस, इकाई लोड करें, और इसे सामान्य के रूप में प्रदर्शित करें।

हालांकि आप रिक्त स्थान को बदलने के लिए एक सरल RegEx का उपयोग कर सकते हैं और अपने स्लग उत्पन्न करने के लिए क्या नहीं, वास्तव में यह बहुत जल्दी टूट जाता है। आपको अपने शीर्षकों में दिखाई देने वाले सभी प्रकार के पात्रों पर विचार करने की आवश्यकता है। इस सटीक उद्देश्य के लिए माइकल कपलन का ब्लॉग भारी रूप से जुड़ा हुआ है; he's shared a function जो तारों से विशिष्ट अंक को पट्टी कर देगा।

इसलिए, आपका "स्लग उत्पन्न" एल्गोरिथ्म आम तौर पर के रूप में लेना चाहिए:

  1. प्रमुख की स्ट्रिंग ट्रिम/पिछली श्वेत रिक्ति
  2. पट्टी विशेषक चिह्नों के माइकल कापलान के समारोह या समकक्ष का उपयोग कर
  3. छोटे कैनॉनिकलाइज़ेशन
  4. के लिए स्ट्रिंग डैश
+0

आप उन्हें डेटाबेस में क्यों स्टोर करेंगे? –

+0

क्यों? आपको ऐसा करने की ज़रूरत नहीं है। आम तौर पर मुझे लगता है कि यह अधिक इष्टतम है। उदाहरण के लिए यदि आप उस विशेष स्लग/यूआरएल को संपादित करना चाहते हैं तो क्या होगा। मैं नहीं जानता कि शायद इसे छोटा या जो भी हो। आप शीर्षक फ़ील्ड को बदले बिना ऐसा करने में सक्षम नहीं होंगे। क्या इस का कोई मतलब निकलता है? – Victor

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