2008-10-27 13 views
7

मेरे वेब ऐप में, मेरे पैरामीटर में पागल पात्रों (रूसी वर्ण, स्लेश, रिक्त स्थान इत्यादि) के सभी प्रकार शामिल हो सकते हैं और हमेशा यूआरएल में प्रदर्शित नहीं किया जा सकता है।
उन्हें अपने सुखद तरीके से भेजना मामलों के लगभग 50% में काम करेगा। रिक्त स्थान जैसी कुछ चीजें पहले से ही एन्कोड की गई हैं (मैं Html.BuildUrlFromExpression करता है) में अनुमान लगा रहा हूं। हालांकि अन्य चीजें (जैसे "/" और "*") नहीं हैं।डबल/अपूर्ण पैरामीटर यूआरएल एन्कोडिंग

अब मुझे नहीं पता कि अब और क्या करना है क्योंकि यदि मैं उन्हें स्वयं एन्कोड करता हूं, तो मेरा एन्कोडिंग आंशिक रूप से फिर से एन्कोड किया जाएगा और गलत समाप्त होगा। अगर मैं उन्हें एन्कोड नहीं करता हूं, तो कुछ पात्र नहीं होंगे।

मैंने जो किया वह मैन्युअल रूप से किया गया है। (जिनके साथ मुझे समस्याएं थीं)।
यह निश्चित रूप से एक अच्छा विचार नहीं है।

विचार?

--Edit--
मैं जानता हूँ कि मेरी निपटान एन्कोडिंग/डिकोडिंग पुस्तकालयों की एक भीड़ कर रहे हैं। ऐसा लगता है कि एमवीसी ढांचा पहले से ही मेरे लिए ऐसा करने की कोशिश कर रहा है, लेकिन पूरी तरह से नहीं।

<a href="<%=Html.BuildUrlFromExpression<SearchController>(c=>c.Search("", 1, "a \v/&irdStr*ng"))%>" title="my hat's awesome!"> 

मुझे

<a href="/Search.mvc/en/Search/1/a%20%5Cv/&irdStr*ng" title="my hat's awesome!"> 

सूचना कैसे फ़ॉरवर्ड स्लैश, तारांकन और एम्परसेंड भाग निकले नहीं कर रहे हैं प्रस्तुत करना होगा। कुछ बच निकले क्यों हैं और दूसरों को नहीं? अब मैं इसे ठीक से कैसे बच सकता हूं?

क्या मैं कुछ गलत कर रहा हूं या यह ढांचा है?

उत्तर

0

क्या आपने एन्कोडिंग करने के लिए Server.UrlEncode() विधि का उपयोग करने का प्रयास किया है, और Server.UrlDecode() विधि को डीकोड करने के लिए विधि?

मुझे आइटम पास करने के लिए इसका उपयोग करने में कोई समस्या नहीं है।

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। मेरे द्वारा किए गए संपादन के लिए कृपया मेरी मूल पोस्ट देखें। मुझे लगता है कि मेरा सवाल पर्याप्त स्पष्ट नहीं था। –

0

Server.URLEncode या HttpServerUtility.UrlEncode

मैं देख रहा हूँ तुम अब क्या कह रहे हैं - मुझे नहीं पता था सवाल MVC के लिए विशिष्ट था। एमवीसी ढांचे के उस हिस्से की सीमा की तरह दिखता है - विशेष रूप से BuildUrlFromExpression कुछ यूआरएल एन्कोडिंग कर रहा है, लेकिन यह जानता है कि फ्रेमवर्क यूआरएल के हिस्से के रूप में उन कुछ विराम चिह्नों की भी आवश्यकता है।

और यह भी दुर्भाग्य से, URLEncoding एक अपरिवर्तनीय का उत्पादन नहीं करता है, यानी

URLEncode(x) != URLEncode(URLEncode(x)) 

कि अच्छा नहीं होगा। फिर आप अपने चर को पूर्व-एन्कोड कर सकते हैं और उन्हें डबल एन्कोड नहीं किया जाएगा।

शायद इसके लिए एक एएसपी.नेट एमवीसी ढांचा सर्वोत्तम अभ्यास है। मुझे लगता है कि आप एक और चीज कर सकते हैं जो बेस 64 या कुछ ऐसा है जो URLEncode-invariant है।

+0

अजीब रूप से पर्याप्त urlEncode इस http://www.w3schools.com/TAGS/ref_urlencode.asp का उपयोग नहीं करता है। उदाहरण के लिए अंतरिक्ष% 25 पर एन्कोड किया जाता है। –

+0

HttpUtility.UrlPathEncode हालांकि –

+0

वास्तव में यह मेरी समस्या है। फिर से गुजरने के लिए धन्यवाद। –

2

पैरामीटर Uri.EscapeDataString का उपयोग कर भाग निकले जाना चाहिए:

  string url = string.Format("http://www.foo.bar/page?name={0}&address={1}", 
       Uri.EscapeDataString("adlknad /?? lkm#"), 
       Uri.EscapeDataString(" qeio103 8182")); 

      Console.WriteLine(url); 
      Uri uri = new Uri(url); 
      string[] options = uri.Query.Split('?','&'); 
      foreach (string option in options) 
      { 
       string[] parts = option.Split('='); 
       if (parts.Length == 2) 
       { 
        Console.WriteLine("{0} = {1}",parts[0], 
         Uri.UnescapeDataString(parts[1])); 
       } 
      } 
+0

प्रतिक्रिया के लिए धन्यवाद, लेकिन कृपया asp.net-mvc टैग को नोट करें। मैंने चीजों को साफ़ करने के लिए अपना प्रश्न संपादित किया। –

+0

टैग जल्दी बदलते हैं; मैं सिर्फ मूल प्रश्न से चला गया ;- लेकिन काफी उचित ... –

0

Microsoft Anti-Cross Site Scripting library का उपयोग करें। इसमें कई एनकोड विधियां हैं, जो सभी पात्रों को एन्कोड करती हैं (# सहित, और अन्य भाषाओं में वर्ण)।डीकोडिंग के लिए, ब्राउज़र को एन्कोडेड यूआरएल को ठीक से संभालना चाहिए, हालांकि अगर आपको यूआरएल मैन्युअल रूप से डीकोड करने की आवश्यकता है, तो Uri.UnescapeDataString

आशा है कि मदद करता है।

+0

यह एक उपयोगी लिंक है, लेकिन मुझे लगता है कि यह मेरी समस्या का समाधान नहीं करेगा। मैंने अपने संपादन में अपनी समस्या को और स्पष्ट करने की कोशिश की। कृपया एक नज़र डालें। –

0

यूआरएल के पथ भाग में आगे के स्लेश और डॉट्स से बचने से सुरक्षा कारण (प्रतिबंधित, यह मोनो में काम करता है) से प्रतिबंधित है।

+0

वह क्यों है? पैरामीटर के साथ जो इन चीजों की आवश्यकता है ... मुझे पता है कि मुझे इन्हें न रखने का प्रयास करना चाहिए, लेकिन यह एक बाहरी डेटा स्रोत है। लोग चीजों को खोजने के लिए इसका इस्तेमाल करते हैं। डेटा को बदलने का कोई तरीका नहीं है ... –

0

Html.BuildUrlFromExpression MVC परियोजना के लिए इस नदी के ऊपर प्रस्तुत हैं ... वैकल्पिक रूप से BuildUrlFromExpression को पार करने से पहले स्ट्रिंग के लिए एन्कोडिंग करते हैं, और यह डिकोड जब यह दूसरे पक्ष पर वापस बाहर आता है, तो समस्या दूर करनी होगी।

यह आसानी से ठीक नहीं हो सकता है, क्योंकि आईआईएस पहले से ही यूआरएल स्ट्रिंग के डिकोडिंग को संभाला जा सकता है ... उपयोगिता विधियों में वैकल्पिक पथ वर्णों के लिए कुछ और उन्नत एन्कोडिंग/डिकोडिंग करने की आवश्यकता हो सकती है, और आपकी तरफ से डीकोड हो सकती है बाहर आ रहा है।

1

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

MVC फ्रेमवर्क वर्ण यह जानता है कि यह सांकेतिक शब्दों में बदलना करने की जरूरत है एन्कोडिंग है, लेकिन उन है कि वैध यूआरएल चरित्र छोड़ने (जैसे &%? * /)। ऐसा इसलिए है क्योंकि ये वैध URL वर्ण हैं, हालांकि वे एक ऐसे URL में विशेष chracters हैं जो आपके बाद के परिणाम को प्राप्त नहीं कर सकते हैं।

+1

सिस्टम-प्रयुक्त वर्णों वाले वर्णों को एन्कोड करने के लिए और भी अधिक कारण नहीं बनेंगे? मुझे कोई कारण नहीं दिख रहा है कि मुझे ऐसे पैरामीटर में क्यों गुजरना चाहिए जो वास्तविक विधि को करने के लिए पहले से ही (भाग) काम करता है। –

+0

ऐसा इसलिए नहीं है क्योंकि वे सिस्टम का उपयोग करते हैं, लेकिन क्योंकि वे URL विनिर्देश के अनुसार मान्य वर्ण नहीं हैं जिन्हें वे एन्कोड किए गए हैं। हालांकि अन्य वर्ण जो यूआरएल में अर्थ परिभाषित करते हैं, वे एन्कोड नहीं होते हैं क्योंकि पूरी तरह वैध हैं। – Ady

0

मैं इस पर समान पदों देखा है। बहुत मुझे, यह एमवीसी में एक दोष की तरह दिखता है। फ़ंक्शन को "BuildUrlFromEncodedExpression" नाम से अधिक उचित रूप से नामित किया जाएगा। क्या बुरा है, यह कहा जाता है कि बुलाए गए फ़ंक्शन को इसके इनपुट पैरामीटर को डीकोड करने की आवश्यकता है। युक।

यदि BuildUrlFromExpression() को एन्कोड किए गए वर्णों और कॉलर द्वारा एन्कोड किए गए वर्णों के बीच कोई ओवरलैप है (जो मुझे लगता है कि सादगी के लिए किसी भी गैर-अल्फान्यूमेरिक को केवल एन्कोड कर सकता है) तो आपके पास खराब कीड़े की संभावना है।

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