2009-02-05 9 views
7

मैंने देखा है कि स्टैक ओवरफ्लो लॉगिन/लॉगआउट लिंक पर रिटर्नुरल यूआरएल पैरामीटर बच निकला नहीं है, लेकिन जब मैं मार्ग पर पैरामीटर के रूप में पथ जोड़ने की कोशिश करता हूं तो यह बच निकलता है।एएसपी.नेट एमवीसी में यूआरएल पैरामीटर को अनदेखा कैसे छोड़ें?

तो/लॉगिन? Returnurl =/प्रश्न/पूछें शो/लॉगिन? Returnurl =% 2fquestions% 2fask और यह बदसूरत है। रिटर्नुरल मूल्य से बचने के लिए मैं इसे कैसे प्राप्त करूं?

यहाँ मैं कोड में क्या कर रहा है:

Html.ActionLink("Login", "Login", "Account", new { returnurl=Request.Path }, null) 
+0

इस जवाब को भी जानना अच्छा लगेगा –

उत्तर

1

मैं किसी कारण से एन्कोडिंग के बारे में टिप्पणियों में से एक को समझता हूं; यह केवल अपवाद होगा, नियम नहीं।

यहां मैंने जो कुछ रखा है, यह कैसे सुधार किया जा सकता है?

public static string ActionLinkNoEscape(this HtmlHelper html, string linkText, string actionName, string controllerName, object values, object htmlAttributes) 
    { 
     RouteValueDictionary routeValues = new RouteValueDictionary(values); 
     RouteValueDictionary htmlValues = new RouteValueDictionary(htmlAttributes); 

     UrlHelper urlHelper = new UrlHelper(html.ViewContext.RequestContext, RouteTable.Routes); 
     string url = urlHelper.Action(actionName, controllerName); 
     url += "?"; 
     List<string> paramList = new List<string>(); 
     foreach (KeyValuePair<string, object> pair in routeValues) 
     { 
      object value = pair.Value ?? ""; 
      paramList.Add(String.Concat(pair.Key, "=", Convert.ToString(value, CultureInfo.InvariantCulture))); 
     } 
     url += String.Join("&", paramList.ToArray()); 

     TagBuilder builder = new TagBuilder("a"); 
     builder.InnerHtml = string.IsNullOrEmpty(linkText) ? "" : HttpUtility.HtmlEncode(linkText); 
     builder.MergeAttributes<string, object>(htmlValues); 
     builder.MergeAttribute("href", url); 
     return builder.ToString(TagRenderMode.Normal); 
    } 
+0

यदि आप इसे MvcHtmlString लौटाते हैं तो थोड़ा बेहतर काम करता है। –

0

मेरे solutionto एक ऐसी ही समस्या मेरे अपने विस्तार लिखने के लिए किया गया था। कोड में चारों ओर खोदने के बाद मुझे अन्यथा ऐसा करने का कोई तरीका नहीं मिला। आपका ऐसा दिख सकता है।

public static class HtmlHelperExtensions 
{ 
    public static string LoginLinkWithReturnUrl(this HtmlHelper helper, 
               string linkText, 
               string action, 
               string controller, 
               string returnUrl, 
               object htmlAttributes) 
    { 
     TagBuilder builder = new TagBuilder("a"); 
     builder.Attributes.Add("href", 
            string.Format("/{0}/{1}?returnurl={2}", 
               controller, 
               action, 
               returnUrl)); 
     var attrDict = new RouteValueDictionary(htmlAttributes); 
     builder.MergeAttributes(attrDict); 
     builder.InnerHtml = linkText; 
     return builder.ToString(); 
    } 
} 

मुझे लगता है कि मैं बनाने और एक UrlHelper तो मैं बजाय String.Format तंत्र के साथ चला गया का उपयोग कर एक ही समस्या थी। YMMV।

+0

इस के साथ एकमात्र समस्या यह है कि आप मार्ग को कड़ी मेहनत कर रहे हैं, जिसका अर्थ यह है कि यदि आप डिफ़ॉल्ट मार्ग का उपयोग नहीं कर रहे हैं तो यह टूट जाएगा। – JMS

+0

यह मेरे सिर के शीर्ष से सिर्फ एक उदाहरण था। शायद आप कार्रवाई/नियंत्रक से मार्ग बनाने के लिए UrlHelper का उपयोग कर सकते हैं और उसके बाद क्वेरी पैरामीटर को इसके अंत में जोड़ सकते हैं। – tvanfosson

6

मैं इसे कैसे returnurl मूल्य

कैसे इस बारे में है बच नहीं करने के लिए मिलता है?

var url = Url.Action("Login", "Account", new {returnurl = Request.Path}); 
var unEncodedUrl = HttpUtility.UrlDecode(url); 
Response.Write("<a href='" + unEncodedUrl + "'>...</a>"); 

यह सुनिश्चित करें कि आप क्या चाहते हैं, हालांकि रहो, URL encoding has its purpose.

+1

त्वरित समाधान। यदि आप कोई जेएस सामग्री बना रहे हैं तो @ Html.Raw (unEncodedUrl) का उपयोग करना पड़ सकता है –

0

मैं वहाँ उसके चारों ओर एक तरीका है कि ढांचे में बनाया गया है विश्वास नहीं है। यूआरएल का वास्तविक निर्माण System.Web.Routing.ParsedRoute.Bind विधि में होता है और बचने से रोकने के लिए उपयोग की जाने वाली कोई भी स्थिति नहीं होती है।

ऐसा लगता है कि एक विस्तार विधि जाने का तरीका है, लेकिन जो पहले उल्लेख किया गया है उससे थोड़ा अधिक मजबूत है।

1

पैरामीटर नहीं छोड़ा जाएगा नहीं है। आप URL पर ध्यान देंगे:

http://stackoverflow.com/users/login?returnurl=%2fquestions%2fask 

करता है वास्तव में काम - तो पढ़ रहे हैं और सामान्य रूप में उस पैरामीटर न छोड़ने है। यदि आप पैरामीटर में '' जैसे अन्य आउट-ऑफ-बाउंड वर्ण शामिल करना चाहते हैं तो आपको अभी भी उनसे बचना होगा।

यह चाल केवल इतना है कि विशेष रूप से '/' चरित्र को क्वेरी पैरामीटर में% से बचने की आवश्यकता नहीं है। यह को अन्य संदर्भों जैसे भाग पथ में भागना होगा, इसलिए सुरक्षित होने के लिए, URLEncode हमेशा इसे एन्कोड करता है।

यदि आप सिर्फ यूआरएल को सुंदर दिखने के लिए चाहते हैं, तो सामान्य रूप से पैरामीटर से बचें (जो आपको अन्य सभी पात्रों से बचने के लिए करना चाहिए जो सही ढंग से संभाला जाना चाहिए), और उसके बाद '% 2f' पर एक स्ट्रिंग को प्रतिस्थापित करें '/'।

+0

मुझे पता है कि यूआरएल काम करेगा लेकिन मुझे देखो पसंद नहीं है, जाहिर है जेफ और चालक दल एसओ पर भी वैसे ही महसूस किया। यह समाधान एक हैक का बहुत अधिक है। – Todd

+0

यदि आप केवल पैरामीटर में% 2F को अनचेक करते हैं तो यह एक मान्य यूआरएल बने रहने की गारंटी है। उपरोक्त आपका कोड किसी भी अन्य चरित्र पर गिर जाएगा जो पैरामीटर में मान्य नहीं है, उदाहरण के लिए। &, ; या%। – bobince

+0

जैसा मैंने कहा, यह एक अपवाद है और नियम नहीं है। – Todd