2009-07-18 15 views
30

से मार्ग मूल्यों इनहेरिट से Url.RouteUrl (...) को रोकने के लिए की सुविधा देता है कहते हैं कि तुम खरीदारी की टोकरी में उत्पादों को प्रदर्शित करने के लिए एक कार्रवाई विधिवर्तमान अनुरोध

// ProductsController.cs 
public ActionMethod Index(string gender) { 

     // get all products for the gender 
} 

कहीं और है, एक मास्टहेड है कि में

<a href="<%= Url.RouteUrl("testimonials-route", new { }) %>" All Testimonials </a> 

यह testimonials-route नीचे पहली मार्ग से global.ascx में परिभाषित किया गया है: हर पृष्ठ तुम Url.RouteUrl उपयोग कर रहे हैं साइट पर अन्य पन्नों के लिए HREF लिंक बनाने के लिए पर प्रदर्शन किया। ध्यान दें कि उपरोक्त कॉल RouteUrlgender प्रदान नहीं करता है, लेकिन मार्ग को 'तटस्थ' के डिफ़ॉल्ट के साथ परिभाषित किया गया है, इसलिए हम प्रशंसापत्रों की उम्मीद करेंगे। इंडेक्स ("तटस्थ") को बुलाया जाना चाहिए। किसी पेज /products जाता है तो इन्हें किसी पेज /products/women दौरा

routes.MapRoute(
    "testimonials-route", 
    "testimonials/{gender}", 
    new { controller = "Testimonials", action = "Index", gender = "neutral" }, 
    new { gender = "(men|women|neutral)" } 
); 

routes.MapRoute(
    "products-route", 
    "products/{gender}", 
    new { controller = "Products", action = "Index", gender = (string)null }, 
    new { gender = "(men|women|neutral)" } 
); 

अगर हम /testimonials/women के लिए एक HREF मिलता तो हम एक खाली HREF (RouteUrl करने के लिए कॉल अशक्त रिटर्न) मिलता है।

लेकिन यह समझ में नहीं आता है? testimonials-route हमारे लिए 'neutral' पर डिफ़ॉल्ट होना चाहिए यदि हम इसके लिए मार्ग मूल्य प्रदान नहीं करते हैं?

क्या पता चला है हो रहा है कि Url.RouteUrl(routeName, routeValues) सहायक विस्तार पहले एक gender मार्ग मूल्य के लिए अपने routeValues पैरामीटर में दिखेगा और अगर यह कि शब्दकोश में यह नहीं मिल रहा है यह (वर्तमान URL है कि हम पर हैं देखेंगे याद रखें कि यूआरएल एक UrlHelper ऑब्जेक्ट है जिसमें वर्तमान अनुरोध का संदर्भ है)।

यदि हम पुरुषों के उत्पाद पृष्ठ पर हैं तो यह पुरुषों के प्रशंसापत्रों के लिए एक लिंक देने का एक संभावित प्रभाव है, लेकिन शायद यह नहीं है कि हम चाहते हैं कि अगर हम RouteUrl कॉल में कोई मान नहीं पारित कर चुके हैं, और स्पष्ट रूप से global.asax.cs फ़ाइल में डिफ़ॉल्ट के रूप में निर्दिष्ट 'तटस्थ' निर्दिष्ट करें।

इस मामले में जहां हमने /products/ का दौरा किया, हमने 'products-route' मार्ग और ट्रिगर Products(null) विधि को ट्रिगर किया। Url.RouteUrl() पर कॉल gender के लिए वास्तव में इस शून्य मान को प्राप्त करता है जब हम testimonials-route का उपयोग कर यूआरएल बना रहे हैं। भले ही हमने gender'testimionials-route में डिफ़ॉल्ट निर्दिष्ट किया है, फिर भी यह इस शून्य मान का उपयोग करता है जो मार्ग विफल होने का कारण बनता है और RouteUrl शून्य देता है। [नोट: मार्ग विफल रहता है क्योंकि हमारे पास (पुरुषों | महिलाओं | तटस्थ) पर एक बाधा है और शून्य ठीक नहीं है]

यह वास्तव में अधिक डरावना हो जाता है - उस 'नियंत्रक' और 'कार्रवाई' में विरासत में विरासत में प्राप्त किया जा सकता है उसी तरह। यह रूट नियंत्रक (...) को एक स्पष्ट नियंत्रक नाम के साथ कॉल करते समय भी गलत नियंत्रक को पूरी तरह से गलत नियंत्रक के लिए जेनरेट किया जा सकता है जिसमें डिफ़ॉल्ट नियंत्रक होता है।

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

+0

मूल प्रश्न के डेढ़ साल बाद एक बक्षीस जोड़ना क्योंकि (ए) मैं जानना चाहता हूं कि ढांचा अब मेरे लिए क्या करता है और (बी) मैं बहुत उत्सुक हूं कि इसमें केवल 2 अपवॉट हैं। सोचा कि यह एक आम समस्या होगी इसलिए सोच रहा हूं कि मैं कुछ गलत कर रहा हूं! –

+0

यह मेरी बूटी को लात मार रहा था, क्योंकि {domain} टैग में मूल्य की कमी थी, लेकिन सिस्टम को स्वचालित रूप से प्रदान करना है। एक बार मैंने इसे बदल दिया, यह काम किया। –

+0

आप केवल RenderUrl को क्यों नहीं कहते हैं: ' "' - इसलिए, कुछ भी ओवरराइट नहीं हो जाता है । – Gerwald

उत्तर

26

मेरे समाधान यह था:

एक HtmlExtension सहायक विधि:

public static string RouteUrl(this UrlHelper urlHelper, string routeName, object routeValues, bool inheritRouteParams) 
    { 
     if (inheritRouteParams) 
     { 
      // call standard method 
      return urlHelper.RouteUrl(routeName, routeValues); 
     } 
     else 
     { 
      // replace urlhelper with a new one that has no inherited route data 
      urlHelper = new UrlHelper(new RequestContext(urlHelper.RequestContext.HttpContext, new RouteData())); 
      return urlHelper.RouteUrl(routeName, routeValues); 
     } 
    } 

मैं अब कर सकते हैं:

Url.RouteUrl('testimonials-route', new { }, false) 

और पता है यकीन है कि यह हमेशा कोई फर्क नहीं पड़ता उसी तरह व्यवहार करेंगे के लिए संदर्भ क्या है।

यह जिस तरह से काम करता है वह मौजूदा UrlHelper लेना और रिक्त 'रूटडेटा' के साथ एक नया बनाना है। इसका मतलब है कि उत्तराधिकारी के लिए कुछ भी नहीं है (यहां तक ​​कि एक शून्य मूल्य)।

+0

जबकि मैं अपने समाधान के साथ ठीक हूं - मेरी इच्छा है कि इसे विश्व स्तर पर लागू करने का एक तरीका था, और हमेशा इस अधिभार का उपयोग करना याद रखना नहीं है। उम्मीद है कि एमवीसी 4 इस पर अधिक नियंत्रण देगा। –

+0

मैं बस एक ही समस्या में भाग गया। यह बहुत उपयोगी था! मैं लिंक के लिए एक ही काम करने के लिए HtmlHelper.RouteLink विधि को विस्तारित करने की सोच रहा था, लेकिन मुझे एक नया HtmlHelper को तुरंत चालू करने के लिए वाक्यविन्यास को हल करने में समस्या हो रही है। – goombaloon

+0

यह एक अच्छा समाधान है। हमारे लिए ये लिंक सभी एक ही आंशिक दृश्य में थे इसलिए मैंने केवल नए यूआरएलहेल्पर को एक चर के रूप में तुरंत चालू किया और मानक यूआरएल संपत्ति के बजाय आंशिक रूप से उस चर का उपयोग किया। –

2

शायद मैं कुछ यहाँ याद कर रहा हूँ, लेकिन क्यों यह सेट नहीं ऊपर इस तरह:

अपने वैश्विक asax में, बनाने के दो मार्गों:

routes.MapRoute(
    "testimonial-mf", 
    "Testimonials/{gender}", 
    new { controller = "Testimonials", action = "Index" } 
); 

routes.MapRoute(
    "testimonial-neutral", 
    "Testimonials/Neutral", 
    new { controller = "Testimonials", action = "Index", gender="Neutral" } 
); 

फिर, Url.Action बजाय यूआरएल का उपयोग .RouteUrl:

<%= Url.Action("Testimonials", "Index") %> 
<%= Url.Action("Testimonials", "Index", new { gender = "Male" }) %> 
<%= Url.Action("Testimonials", "Index", new { gender = "Female" }) %> 

कौन सा है, मेरे मशीन निम्नलिखित यूआरएल पर ले कर पर:

/Testimonials/Neutral 
/Testimonials/Male 
/Testimonials/Female 

मुझे यकीन नहीं है कि यह एक स्वीकार्य समाधान है, लेकिन यह एक विकल्प है, नहीं?

+0

दुर्भाग्य से (या सौभाग्य से शायद!) समस्या यूआरएल की पार्सिंग और रूटिंग में नहीं है। जो पूरी तरह से अपेक्षित काम करता है - इसलिए आपका पहला मार्ग पर्याप्त है (यदि आप डिफ़ॉल्ट पैरामीटर जोड़ते हैं)। यह यूआरएल के वास्तविक निर्माण में है जब मौजूदा मार्ग मान अप्रत्याशित रूप से विरासत में प्राप्त होते हैं। मेरा समाधान मैं एक साल से अधिक समय से उपयोग कर रहा हूं - यह केवल परेशान है जब आपको रूट यूआरएल या रूटलिंक के अन्य अधिभारों का उपयोग करने की आवश्यकता है और आपको विधि ओवरलोड का एक टन बनाना होगा। हालांकि उत्तर के लिए धन्यवाद –

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