ASP.NET MVC का उपयोग करके कई पैरामीटर के साथ रूटिंग


139

हमारी कंपनी हमारे उत्पादों के लिए एक एपीआई विकसित कर रही है और हम ASP.NET MVC का उपयोग करने के बारे में सोच रहे हैं। हमारे एपीआई को डिज़ाइन करते समय, हमने XML प्रारूप में एपीआई से जानकारी का अनुरोध करने के लिए उपयोगकर्ता की तरह नीचे कॉल का उपयोग करने का फैसला किया:

http://ws.audioscrobbler.com/2.0/?method=artist.getimages&artist=cher&api_key=b25b959554ed76058ac220b7b2e0a026

जैसा कि आप देख सकते हैं, कई मापदंडों को पारित किया जाता है (यानी artistऔर api_key)। ASP.NET MVC में, artistहो सकता है controller, getImagesकार्रवाई है, लेकिन मैं कैसे कार्रवाई करने के लिए कई पैरामीटर पास हैं?

क्या उपरोक्त प्रारूप का उपयोग करना भी संभव है?

जवाबों:


279

पैरामीटर्स को एमवीसी में सीधे तौर पर आपकी कार्रवाई विधियों में पैरामीटर जोड़कर समर्थित किया जाता है। निम्नलिखित की तरह एक कार्रवाई को देखते हुए:

public ActionResult GetImages(string artistName, string apiKey)

जब कोई URL दिया जाता है, तो MVC मापदंडों को ऑटो-पॉप्युलेट करेगा:

/Artist/GetImages/?artistName=cher&apiKey=XXX

एक अतिरिक्त विशेष मामला "आईडी" नाम के मापदंडों का है। आईडी नाम के किसी भी पैरामीटर को क्वेरिस्ट्रिंग के बजाय रास्ते में रखा जा सकता है, इसलिए कुछ इस तरह है:

public ActionResult GetImages(string id, string apiKey)

निम्नलिखित जैसे URL के साथ सही रूप से पॉपुलेट किया जाएगा:

/Artist/GetImages/cher?apiKey=XXX

इसके अलावा, यदि आपके पास अधिक जटिल परिदृश्य हैं, तो आप उन रूटिंग नियमों को अनुकूलित कर सकते हैं जो एमवीसी एक कार्रवाई का पता लगाने के लिए उपयोग करता है। आपकी Global.asax फ़ाइल में रूटिंग नियम हैं जिन्हें अनुकूलित किया जा सकता है। डिफ़ॉल्ट रूप से नियम इस तरह दिखता है:

routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

यदि आप एक यूआरएल का समर्थन करना चाहते थे

/Artist/GetImages/cher/api-key

आप एक मार्ग जोड़ सकते हैं जैसे:

routes.MapRoute(
            "ArtistImages",                                              // Route name
            "{controller}/{action}/{artistName}/{apikey}",                           // URL with parameters
            new { controller = "Home", action = "Index", artistName = "", apikey = "" }  // Parameter defaults
        );

और ऊपर पहले उदाहरण की तरह एक विधि।


1
मैं .NET 4 और MVC के साथ काम कर रहा हूं। मैं पथ में केवल एक पैरामीटर पास कर सकता हूं। यह URL {कंट्रोलर} / {एक्शन} / {आर्टिस्टनेम} / {एपिके} मेरे लिए 2 पैरामीटर्स पर मैप नहीं करता है, लेकिन केवल 404 एरर को ट्रिगर करता है। जहाँ तक मैं बता सकता हूँ कि आप पथ में केवल 1 पैरामीटर पास कर सकते हैं। मैं क्या गलत कर रहा हूं?
डेविडहाइगो

1
@DavidHyogo - मैं एक ही मुद्दे का अनुभव कर रहा था। जो भी कारण के लिए, भले ही मैंने डिफ़ॉल्ट कार्रवाई निर्दिष्ट की, मुझे वास्तव में वह कार्रवाई करनी चाहिए जो मैं अपने HTML लिंक में चाहता था, न कि केवल नियंत्रक और मापदंडों के लिए।
Shaggy13spe

5
@DavidHyogo: मेरे पास एक ही मुद्दा था और पता चला कि आपके मार्ग टेम्पलेट मापदंडों को निश्चित रूप से एक्शन विधि पैरामीटर के नामों से मेल खाना चाहिए, उदाहरण के लिए {कंट्रोलर} / {एक्शन} / {आर्टिस्टनेम} / {एपिके} के रूप में परिभाषित किए गए एक्शन मेथड में हस्ताक्षर होने चाहिए सार्वजनिक लड़ाई। मायमेथोड (स्ट्रिंग कलाकार नाम, स्ट्रिंग एपिके)
सुधांशु मिश्रा

6
यह भी सुनिश्चित करें कि आपका URL आपके कस्टम एक तक पहुंचने से पहले डिफ़ॉल्ट मार्ग से पकड़ा नहीं जा रहा है। यह पहले मैच का उपयोग करेगा कि आपने उन्हें कैसे परिभाषित किया। मेरे मामले में, मैं सूचकांक के डिफ़ॉल्ट के लिए "MyController / {year} / {month}" मार्ग का उपयोग करने की कोशिश कर रहा था, लेकिन मार्ग {नियंत्रक} / {क्रिया} / {id} मेरे URL (MyController / 2015) से मेल खा रहा था / ०४), इसलिए मुझे ४०४ मिल रहा था क्योंकि २०१५ नाम की कोई कार्रवाई नहीं थी। मेरे कस्टम रूट को शीर्ष पर ले जाने से समस्या ठीक हो गई।
सैम

Routeconfig में पैरामीटर्स का नाम मेरे एक्शन सिग्नेचर से मेल नहीं खाता, इसीलिए यह काम नहीं कर रहा था, मैंने @dotnetguy द्वारा बताए गए चरणों का पालन किया और इसने काम किया
पेपिटॉम्ब

26

MVC 5 से शुरू करके, आप अपने नियंत्रकों के लिए URL पैरामीटर कॉन्फ़िगरेशन को स्थानांतरित करने के लिए विशेषता रूटिंग का उपयोग कर सकते हैं।

एक विस्तृत चर्चा यहाँ उपलब्ध है: http://blogs.msdn.com/b/webdev/archive/2013/10/10/17/attribute-rout-in-asp-net-mvc-5.aspx

सारांश:

पहले आप विशेषता रूटिंग को सक्षम करें

 public class RouteConfig 
 {
     public static void RegisterRoutes(RouteCollection routes)
     {
         routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

         routes.MapMvcAttributeRoutes();
     } 
 }

फिर आप मापदंडों और वैकल्पिक रूप से डेटा प्रकारों को परिभाषित करने के लिए विशेषताओं का उपयोग कर सकते हैं

public class BooksController : Controller
{
    // eg: /books
    // eg: /books/1430210079
    [Route("books/{isbn?}")]
    public ActionResult View(string isbn)

5
ASP.NET Core MVC में विशेषता रूटिंग docs.microsoft.com/en-us/aspnet/core/mvc/controllers/…
बर्नार्ड वेंडर

21

आप क्वेरी स्ट्रिंग के माध्यम से मनमाना पैरामीटर पारित कर सकते हैं, लेकिन आप इसे कस्टम तरीके से संभालने के लिए कस्टम मार्ग भी सेट कर सकते हैं:

http://ws.audioscrobbler.com/2.0/?method=artist.getimages&artist=cher&
                                  api_key=b25b959554ed76058ac220b7b2e0a026

ऐसा हो सकता है:

routes.MapRoute(
    "ArtistsImages",
    "{ws}/artists/{artist}/{action}/{*apikey}",
    new { ws = "2.0", controller="artists" artist = "", action="", apikey="" }
    );

इसलिए यदि कोई निम्नलिखित मार्ग का उपयोग करता है:

ws.audioscrobbler.com/2.0/artists/cher/images/b25b959554ed76058ac220b7b2e0a026/

यह उन्हें उसी जगह पर ले जाएगा जहां आपके उदाहरण ने querystring किया था।

उपरोक्त केवल एक उदाहरण है, और उन व्यावसायिक नियमों और बाधाओं को लागू नहीं करता है जिन्हें आपने यह सुनिश्चित करने के लिए स्थापित किया होगा कि लोग URL को 'हैक' न करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.