5

को हल नहीं के साथ मार्ग मैं @Url.Action नहीं मिल सकता यूआरएल मैं विशेषता मार्ग मैं आवेदन किया है के आधार पर की उम्मीद कर रहा हूँ करने के लिए हल करने के लिए:MVC गुण Url.Action मार्ग

मेरे एक्शन (SearchController लेकिन [RoutePrefix साथ ("जोड़ने ")])

 [Route("{searchTerm}/page/{page?}", Name = "NamedSearch")] 
    [Route("~/add")] 
    public ActionResult Index(string searchTerm = "", int page = 1) 
    { 
     ... 
    } 

कॉल Url.Action को

@Url.Action("Index", new { controller = "Search", searchTerm = "replaceMe", page = 1 }) 

यह

/add?searchTerm=replaceMe&page=1

की एक यूआरएल में जो परिणाम मैं

/add/replaceMe/page/1

उम्मीद होती है, तो मैं मैन्युअल रूप से तो इसके साथ सही कार्रवाई करने के लिए हल करता यूआरएल टाइप सही पैरामीटर। @Url.Action सही यूआरएल क्यों हल नहीं करता है?

उत्तर

11

चूंकि आपके पास अपनी सुंदर मार्ग परिभाषा का नाम है, तो आप RouteUrl विधि का उपयोग कर सकते हैं।

@Url.RouteUrl("NamedSearch", new { searchTerm = "replaceMe", page = 1}) 

और चूंकि आप यूआरएल में जोड़ने की जरूरत है, तो आप शामिल करने के लिए है कि यूआरएल ढांचा में अपने मार्ग परिभाषा अद्यतन करना चाहिए।

[Route("~/add")] 
[Route("~/add/{searchTerm?}/page/{page?}", Name = "NamedSearch")] 
public ActionResult Index(string searchTerm = "", int page = 1) 
{ 
// to do : return something 
} 
+1

धन्यवाद, दोनों मार्गों पर एक नाम जोड़ना और रूटयूआरएल का उपयोग करना दोनों मार्गों के लिए यह काम करने का एकमात्र विश्वसनीय तरीका था। – Simon

+0

उन लोगों के लिए जो यहां आते हैं और एपीकंट्रोलर में किसी कार्रवाई के लिए मार्ग चाहते हैं: @ Url.HttpRouteUrl इस मामले में चाल प्राप्त करता है ;-) –

+0

इससे मुझे ट्रॉय गूदे की पजेडलिस्ट के लिए सही मार्ग पारित करने में मदद मिली। लगभग एक दिन के लिए मेरे सिर रैकिंग था! – Shiva

3

मार्ग ऑर्डर संवेदनशील हैं। हालांकि, गुण नहीं हैं। वास्तव में, इस तरह की एक ही क्रिया पर 2 Route गुणों का उपयोग करते समय आप पाएंगे कि यह कुछ संकलनों पर काम करता है, न कि दूसरों पर। क्योंकि कस्टम गुणों का विश्लेषण करते समय प्रतिबिंब किसी आदेश की गारंटी नहीं देता है।

यह सुनिश्चित करने के लिए कि आपके मार्ग सही क्रम में रूट तालिका में प्रवेश किए गए हैं, आपको प्रत्येक विशेषता में Order संपत्ति जोड़ने की आवश्यकता है।

[Route("{searchTerm}/page/{page?}", Name = "NamedSearch", Order = 1)] 
[Route("~/add", Order = 2)] 
public ActionResult Index(string searchTerm = "", int page = 1) 
{ 
    return View(); 
} 

ऑर्डरिंग समस्या को ठीक करने के बाद, यूआरएल आपके द्वारा अपेक्षित तरीके से हल करता है।

@Url.Action("Index", new { controller = "Search", searchTerm = "replaceMe", page = 1 }) 

// Returns "/add/replaceMe/page/1" 
+0

धन्यवाद, मैंने पाया कि इसने 'नामांकित खोज' मार्ग तय किया है, लेकिन यदि मैंने @ HTML.ActionLink ("समस्याएं जोड़ें", "अनुक्रमणिका", नया {नियंत्रक = "खोज"}) का उपयोग किया है तो मूल मार्ग (ऑर्डर = 2) तोड़ दिया। काम करने के लिए यह एकमात्र विश्वसनीय तरीका था जो दोनों को नाम जोड़ना था। – Simon

0

पूर्ण URL उपयोग इस

@Url.Action("Index", new { controller = "Search", searchTerm = "replaceMe", page = 1}, protocol: Request.Url.Scheme) 

// Returns "http://yourdomain.com/add/replaceMe/page/1" 

आशा इस कोई मदद करता है वापस जाने के लिए।

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