2010-02-04 10 views
6

मैं एक मार्ग है कि इस तरह दिखता है मिल गया है से बचने के लिए:ASP.NET MVC हो रही है सही ढंग से मार्गों में # (हैश/पाउंड) चरित्र

routes.MapRoute(
"BlogTags", 
"Blog/Tags/{tag}", 
new { controller = "Blog", action = "BrowseTag", viewRss = false } 
); 

और मैं एक URL ऐसा है कि मार्ग का उपयोग कर बनाने के लिए:

<%= Html.RouteLink(Html.Encode(sortedTags[i].Tag), 
     new { action = "BrowseTag", tag = sortedTags[i].Tag })%> 

हालांकि, जब एक # चरित्र (जैसे "सी #") के साथ एक टैग प्रयोग किया जाता है, मार्ग इंजन यह बच नहीं करता है, तो मैं एक यूआरएल है कि इस तरह दिखता है मिलती है:

<a href="/Blog/Tags/C#">C#</a> 

मैं क्या जरूरत है # इसलिए बच गए है कि यह इस तरह दिखता है है:

<a href="/Blog/Tags/C%23">C#</a> 

मैं इस तरह से पहले ही मार्ग में चला गया टैग पर एक Url.Encode कर रही है, की कोशिश की:

<%= Html.RouteLink(Html.Encode(sortedTags[i].Tag), 
     new { action = "BrowseTag", tag = Url.Encode(sortedTags[i].Tag) })%> 

<a href="/Blog/Tags/C%2523">C#</a> 

कैसे मैं मेरे correc के लिए कि # चरित्र से बचने के लिए मार्ग इंजन प्राप्त कर सकते हैं: लेकिन है कि मार्ग इंजन डबल # (जो एक बुरी अनुरोध त्रुटि के साथ एक ASP.NET दुर्घटना का कारण बनता है)) से बचने के लिए बनाता है tly?

अग्रिम में आपकी सहायता के लिए धन्यवाद।

+2

एक साइड नोट के रूप में, रूटिंग इंजन .NET 4 में तय किया गया है। यह सब कुछ पारित होने से बच जाएगा। यदि आप .NET 4 पर एक एमवीसी 2 ऐप चला रहे हैं, तो आप इस व्यवहार को स्वचालित रूप से चुनने में सक्षम होना चाहिए। – Levi

उत्तर

1

एक बहुत गंजा समाधान के रूप में, मैं रूटलिंक के आउटपुट में मैन्युअल रूप से "# 23" के साथ "# 23" को प्रतिस्थापित कर दूंगा। बशर्ते आप अपने यूआरएल में टुकड़ों का उपयोग न करें, इसे काम करना चाहिए।

आप नियमित रूप से अभिव्यक्ति का उपयोग केवल अपने यूआरएल के अंतिम भाग में प्रतिस्थापित करने के लिए कर सकते हैं।

+1

अगर मुझे क्लीनर नहीं मिल रहा है (यानी खंड-समर्थन, सब कुछ के लिए काम करता है) समाधान, मैं पूरी तरह से आपकी सलाह ले जाऊंगा। –

+0

एक विकल्प के रूप में, रूटलिंक के स्रोत कोड के अंदर देखें। शायद आप एक अधिभार जोड़ सकते हैं। मैंने पाया है कि कुछ कस्टम व्यवहार जोड़ने के आधार पर एमवीसी के स्रोत कोड को लेना वास्तव में आप जो चाहते हैं उसे प्राप्त करने का एक शानदार तरीका है। खंडन समर्थन के साथ RedirectToRoute उनमें से एक था। –

0

मेरे पास "/" से संबंधित similar SO question है। उस मुद्दे पर शोध करते समय मैंने सीखा कि एएसपी.नेट यूआरएल मान से पहले डीकोड करता है, वे एमवीसी ढांचे में पास हो जाते हैं, और चूंकि "#" के पास यूआरएल के लिए विशेष अर्थ है (जैसे "/" मैं जिस तरह से व्यवहार कर रहा था) एक अच्छा है मौका कि बेस रूटिंग इंजन में कुछ इस व्यवहार का कारण बन रहा है।

लेवी की तरह उनकी टिप्पणी में उल्लेख किया गया है, एक समाधान ASP.NET 4.0 का उपयोग करना है। एक अन्य समाधान एक रूटलिंक सहायक लिखना होगा जो कुछ मार्कर (जैसे "! MY_HASH_TOKEN!") के साथ स्वचालित रूप से "#" को प्रतिस्थापित करता है और फिर उस नियंत्रक को अपने नियंत्रक (या शायद किसी प्रकार के HttpModule के माध्यम से) को उलट देता है।

या, केवल तौलिया में फेंक दें और टैग मान को क्वेरीस्ट्रिंग तर्क के रूप में पास करें। सेक्सी नहीं, लेकिन यह आसान है और यह काम करता है।

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