से मार्ग मूल्यों इनहेरिट से 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 लिंक बनाने के लिए पर प्रदर्शन किया। ध्यान दें कि उपरोक्त कॉल RouteUrl
gender
प्रदान नहीं करता है, लेकिन मार्ग को 'तटस्थ' के डिफ़ॉल्ट के साथ परिभाषित किया गया है, इसलिए हम प्रशंसापत्रों की उम्मीद करेंगे। इंडेक्स ("तटस्थ") को बुलाया जाना चाहिए। किसी पेज /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
शून्य देता है। [नोट: मार्ग विफल रहता है क्योंकि हमारे पास (पुरुषों | महिलाओं | तटस्थ) पर एक बाधा है और शून्य ठीक नहीं है]
यह वास्तव में अधिक डरावना हो जाता है - उस 'नियंत्रक' और 'कार्रवाई' में विरासत में विरासत में प्राप्त किया जा सकता है उसी तरह। यह रूट नियंत्रक (...) को एक स्पष्ट नियंत्रक नाम के साथ कॉल करते समय भी गलत नियंत्रक को पूरी तरह से गलत नियंत्रक के लिए जेनरेट किया जा सकता है जिसमें डिफ़ॉल्ट नियंत्रक होता है।
इस मामले में एक बार जब आप इसे समझ लेंगे तो आप इसे कई तरीकों से आसानी से ठीक कर सकते हैं, लेकिन यह अन्य मामलों में कुछ खतरनाक व्यवहार कर सकता है। यह डिजाइन द्वारा हो सकता है, लेकिन यह निश्चित रूप से डरावना है।
मूल प्रश्न के डेढ़ साल बाद एक बक्षीस जोड़ना क्योंकि (ए) मैं जानना चाहता हूं कि ढांचा अब मेरे लिए क्या करता है और (बी) मैं बहुत उत्सुक हूं कि इसमें केवल 2 अपवॉट हैं। सोचा कि यह एक आम समस्या होगी इसलिए सोच रहा हूं कि मैं कुछ गलत कर रहा हूं! –
यह मेरी बूटी को लात मार रहा था, क्योंकि {domain} टैग में मूल्य की कमी थी, लेकिन सिस्टम को स्वचालित रूप से प्रदान करना है। एक बार मैंने इसे बदल दिया, यह काम किया। –
आप केवल RenderUrl को क्यों नहीं कहते हैं: ' "' - इसलिए, कुछ भी ओवरराइट नहीं हो जाता है । – Gerwald