2008-10-22 14 views
8

एक एएसपी.नेट एमवीसी (बीटा) साइट पर जो मैं विकसित कर रहा हूं कभी-कभी एक्शनलिंक पर कॉल करता है, मुझे क्वेरीिंग स्ट्रिंग वाले यूआरएल पर वापस आ जाएगा। मैंने इस व्यवहार को उत्पन्न करने वाली परिस्थितियों को अलग कर दिया है, लेकिन मुझे अभी भी समझ में नहीं आता है कि क्यों, एक स्वच्छ यूआरएल बनाने के बजाय, यह एक क्वेरी स्ट्रिंग पैरामीटर का उपयोग करने का फैसला करता है। मुझे पता है कि कार्यात्मक रूप से वे वही हैं, लेकिन यूआरएल की स्थिरता (और उपस्थिति) के लिए यह वही नहीं है जो मैं चाहता हूं।क्यों मेरे एएसपी.नेट एमवीसी मार्ग में क्वेरी स्ट्रिंग?

routes.MapRoute(
    "Photo Gallery Shortcut", 
    "group/{groupname}", 
    new { controller = "Photos", action = "All", Id = "" }); 

routes.MapRoute(
    "Tagged Photos", //since the Tagged action takes an extra parameter, put it first 
    "group/{groupname}/Photos/Tagged/{tagname}/{sortby}", 
    new { controller = "Photos", action = "Tagged", Id = "", SortBy = "" }); 

routes.MapRoute(
    "Photo Gallery", //since the Gallery's defualt action is "All" not "Index" its listed seperatly 
    "group/{groupname}/Photos/{action}/{sortby}", 
    new { controller = "Photos", action = "All", Id = "", SortBy = "" }); 

routes.MapRoute(
    "Group", //<-- "Group" Category defined above 
    "group/{groupname}/{controller}/{action}/{id}", 
    new {controller = "Photos", action = "Index", Id = ""}); 

अब समस्या केवल तब होता है जब मैं के माध्यम से नाम "टैग तस्वीरें" दृश्य मार्ग द्वारा वर्णित तलाश में हूं और निष्पादित ActionLink:

यहाँ मेरी रास्ते हैं

Html.ActionLink<PhotosController>(p => p.All((string)ViewData["group"], ""), "Home") 

कौन सा यूआरएल का उत्पादन करता है:

http://domain/group/GROUPNAME?sortBy= 

किसी अन्य दृश्य से उत्पादित यूआरएल है:

http://domain/group/GROUPNAME 

मैंने फिल के ASP.NET Routing Debugger को खींच लिया है, और सबकुछ क्रम में दिखाई देता है। यह मुझे स्टंप कर दिया है। कोई विचार?

उत्तर

3

यह सुनिश्चित नहीं है कि अलग-अलग विचार अलग-अलग URL क्यों बना रहे हैं।

लेकिन आप उस मार्ग से छुटकारा पा सकते हैं द्वारा पहले मार्ग पर डिफ़ॉल्ट मान निर्दिष्ट करके।

नए {sortBy = ""}

पीढी के दौरान, अगर sortBy डिफ़ॉल्ट से मेल खाता है, मार्ग इंजन है कि पैरामीटर को छोड़ देगा (यदि यह क्वेरी स्ट्रिंग में है)।

+0

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

+0

जब आप कोई अन्य प्रकार निर्दिष्ट करते हैं, तो sortBy = blah querystring param जोड़ा जाएगा। – CVertex

0

मुझे लगता है कि यह आपका पहला मार्ग उठा रहा है। यह भी कार्रवाई सब है। और क्योंकि सॉर्टबी निर्दिष्ट नहीं है कि यह इसे क्वेरीस्ट्रिंग पैरामीटर के रूप में उजागर कर रहा है

यह अभी भी फ़ोटो कंट्रोलर पर एक्शन विधि 'ऑल' के साथ काम करेगा, क्योंकि यह क्वेरी स्ट्रिंग मान के साथ सॉर्टबाई पैरामीटर को भरता है।

रूट डीबगर में यह तीसरा मार्ग या पहला निष्पादित कर रहा है?

2

एएसपी.NET में रूटिंग काम करने के तरीके के कारण आपको नाम मार्गों का उपयोग करना होगा, क्योंकि यह "पहला मैच" नहीं है, न कि "सर्वश्रेष्ठ मिलान"।

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