asp.net-mvc
रूटिंग
खोज…
परिचय
रूटिंग कैसे ASP.NET MVC एक क्रिया के लिए URI से मेल खाता है। रूटिंग मॉड्यूल विशेष रूप से MVC नियंत्रक क्रियाओं के लिए आने वाले ब्राउज़र अनुरोधों की मैपिंग के लिए जिम्मेदार है।
MVC 5 एक नए प्रकार के रूटिंग का समर्थन करता है, जिसे विशेषता रूटिंग कहा जाता है। जैसा कि नाम से ही स्पष्ट है, रूट को परिभाषित करने के लिए विशेषता रूटिंग विशेषताओं का उपयोग करती है। विशेषता रूटिंग आपको अपने वेब एप्लिकेशन में यूआरआई पर अधिक नियंत्रण देता है।
कस्टम रूटिंग
कस्टम रूटिंग विशिष्ट आवक अनुरोधों को संभालने के लिए रूटिंग की विशेष आवश्यकता प्रदान करता है।
कस्टम मार्गों को परिभाषित करने के लिए, ध्यान रखें कि रूट टेबल में आपके द्वारा जोड़े जाने वाले मार्गों का क्रम महत्वपूर्ण है।
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// this is an advanced custom route
// you can define custom URL with custom parameter(s) point to certain action method
routes.MapRoute(
"CustomEntry", // Route name
"Custom/{entryId}", // Route pattern
new { controller = "Custom", action = "Entry" } // Default values for defined parameters above
);
// this is a basic custom route
// any custom routes take place on top before default route
routes.MapRoute(
"CustomRoute", // Route name
"Custom/{controller}/{action}/{id}", // Route pattern
new { controller = "Custom", action = "Index", id = UrlParameter.Optional } // Default values for defined parameters above
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // Route pattern
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Default values for defined parameters above
);
}
controller
और action
नाम आरक्षित हैं। डिफ़ॉल्ट रूप से MVC नक्शे {controller}
वर्ग के लिए URL के भाग <controller>Controller
, और उसके बाद नाम के साथ एक विधि के लिए लग रहा है <action>
किसी भी प्रत्यय जोड़े बिना।
हालाँकि यह {controller}/{action}/{parameter}
टेम्प्लेट का उपयोग करते हुए मार्गों का एक परिवार बनाने के लिए लुभावना हो सकता है, लेकिन विचार करें कि ऐसा करने से आप अपने एप्लिकेशन की संरचना का खुलासा करते हैं और URL को कुछ भंगुर बना देते हैं क्योंकि कंट्रोलर का नाम बदलने से परिवर्तन होता है मार्ग और उपयोगकर्ता द्वारा सहेजे गए लिंक को तोड़ता है।
स्पष्ट मार्ग सेटिंग को प्राथमिकता दें:
routes.MapRoute(
"CustomRoute", // Route name
"Custom/Index/{id}", // Route pattern
new { controller = "Custom", action = nameof(CustomController.Index), id = UrlParameter.Optional }
);
(आप नियंत्रक नाम के लिए nameof
ऑपरेटर का उपयोग नहीं कर सकते क्योंकि इसमें अतिरिक्त प्रत्यय Controller
) जो मार्ग में नियंत्रक नाम सेट करते समय छोड़ा जाना चाहिए।
Mvc में कस्टम मार्ग जोड़ना
उपयोगकर्ता कस्टम मार्ग को जोड़ सकता है, एक नियंत्रक में एक विशिष्ट कार्रवाई के लिए एक URL मैप कर सकता है। इसका उपयोग सर्च इंजन ऑप्टिमाइजेशन उद्देश्य के लिए किया जाता है और URL को पठनीय बनाते हैं।
routes.MapRoute(
name: "AboutUsAspx", // Route name
url: "AboutUs.aspx", // URL with parameters
defaults: new { controller = "Home", action = "AboutUs", id = UrlParameter.Optional } // Parameter defaults
);
MVC में विशेषता रूटिंग
मार्ग परिभाषा के क्लासिक तरीके के साथ MVC WEB API 2 और फिर MVC 5 रूपरेखाओं ने Attribute routing
शुरुआत की:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// This enables attribute routing and must go before other routes are added to the routing table.
// This makes attribute routes have higher priority
routes.MapMvcAttributeRoutes();
}
}
नियंत्रक के अंदर समान उपसर्ग वाले मार्गों के लिए, आप RoutePrefix
विशेषता का उपयोग करके नियंत्रक के अंदर संपूर्ण क्रिया विधियों के लिए एक सामान्य उपसर्ग सेट कर सकते हैं।
[RoutePrefix("Custom")]
public class CustomController : Controller
{
[Route("Index")]
public ActionResult Index()
{
...
}
}
RoutePrefix
वैकल्पिक है और URL के हिस्से को परिभाषित करता है जो नियंत्रक के सभी कार्यों के लिए उपसर्ग करता है।
यदि आपके पास कई मार्ग हैं, तो आप पैरामीटर के रूप में कार्रवाई पर कब्जा करके एक डिफ़ॉल्ट मार्ग निर्धारित कर सकते हैं, फिर इसे पूरे नियंत्रक के लिए लागू कर सकते हैं जब तक कि विशिष्ट कार्य विधि (एस) पर परिभाषित विशिष्ट Route
विशेषता जो डिफ़ॉल्ट मार्ग को ओवरराइड करती है।
[RoutePrefix("Custom")]
[Route("{action=index}")]
public class CustomController : Controller
{
public ActionResult Index()
{
...
}
public ActionResult Detail()
{
...
}
}
रूटिंग मूल बातें
आप यूआरएल का अनुरोध करते हैं yourSite/Home/Index
एक ब्राउज़र के माध्यम, रूटिंग मॉड्यूल के लिए अनुरोध निर्देशित करेंगे Index
की कार्रवाई विधि HomeController
वर्ग। इस विशिष्ट वर्ग की विशिष्ट विधि के लिए अनुरोध भेजने का पता कैसे चलता है? रूटटेबल आता है।
हर एप्लिकेशन का एक रूट टेबल होता है जहां वह रूट पैटर्न और जानकारी को संग्रहीत करता है कि अनुरोध को कहां निर्देशित किया जाए। इसलिए जब आप अपना mvc एप्लिकेशन बनाते हैं, तो रूटिंग टेबल में पहले से पंजीकृत एक डिफ़ॉल्ट मार्ग होता है। आप देख सकते हैं कि RouteConfig.cs
वर्ग में।
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute("Default", "{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional });
}
आप देख सकते हैं कि प्रविष्टि में एक नाम और एक टेम्पलेट है। टेम्पलेट एक अनुरोध आने पर रूट पैटर्न की जाँच करने के लिए होता है। डिफ़ॉल्ट टेम्पलेट में एक्शन सेगमेंट के मूल्य के रूप में कंट्रोलर यूआरएल सेगमेंट और Index
के मूल्य के रूप में Home
। इसका मतलब है, यदि आप स्पष्ट रूप से आपके अनुरोध में नियंत्रक नाम और कार्रवाई नहीं कर रहे हैं, तो यह इन डिफ़ॉल्ट मानों का उपयोग करेगा। यही कारण है कि जब आप अपने yourSite/Home/Index
और yourSite
उपयोग करते हैं तो आपको वही परिणाम मिलता है
आपने देखा होगा कि हमारे पास हमारे रूट पैटर्न के अंतिम खंड के रूप में आईडी नामक एक पैरामीटर है। लेकिन चूक में, हम निर्दिष्ट करते हैं कि यह वैकल्पिक है। यही कारण है कि हमें आईडी वैल्यू को निर्दिष्ट करने की आवश्यकता नहीं थी जो उसने हमारे द्वारा की गई कोशिश की थी।
अब, HomeController में इंडेक्स एक्शन विधि पर वापस जाएं और उस पर एक पैरामीटर जोड़ें
public ActionResult Index(int id)
{
return View();
}
अब इस विधि में एक दृश्य स्टूडियो ब्रेकपॉइंट लगाएं । अपने प्रोजेक्ट को चलाएं और अपने ब्राउज़र में अपने yourSite/Home/Index/999
तक yourSite/Home/Index/999
। ब्रेकपॉइंट मारा जाएगा और आपको यह देखने में सक्षम होना चाहिए कि मूल्य 999 अब id
पैरामीटर में उपलब्ध है।
दूसरा रूट पैटर्न बनाना
मान लीजिए कि हम इसे एक सेट अप करना चाहते हैं ताकि एक ही एक्शन विधि को एक अलग रूट पैटर्न के लिए बुलाया जाएगा। हम रूट तालिका में नई रूट परिभाषा जोड़कर ऐसा कर सकते हैं।
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// New custom route definition added
routes.MapRoute("MySpecificRoute",
"Important/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional });
//Default catch all normal route definition
routes.MapRoute("Default", "{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional });
}
मेरे द्वारा जोड़ी गई नई परिभाषा में एक पैटर्न Important/{id}
जहां आईडी फिर से वैकल्पिक है। इसका मतलब है कि जब आप अपने yourSiteName\Important
या yourSiteName\Important\888
अनुरोध करते हैं, तो यह HomeController की अनुक्रमणिका कार्रवाई को भेज दिया जाएगा।
मार्ग परिभाषा पंजीकरण का आदेश
मार्ग पंजीकरण का क्रम महत्वपूर्ण है। जेनेरिक डिफॉल्ट रूट से पहले आपको हमेशा विशिष्ट रूट पैटर्न रजिस्टर करना चाहिए।
कैच-ऑल रूट
मान लीजिए कि हम एक ऐसा मार्ग चाहते हैं, जो इस तरह के कई खंडों की अनुमति देता है:
- http://example.com/Products/ (सभी उत्पादों को देखें)
- http://example.com/Products/IT
- http://example.com/Products/IT/Laptops
- http://example.com/Products/IT/Laptops/Ultrabook
- http://example.com/Products/IT/Laptops/Ultrabook/Asus
- आदि।
हमें रूट तालिका के अंत में एक मार्ग जोड़ना होगा, क्योंकि यह संभवतः सभी अनुरोधों को पकड़ लेगा, जैसे:
routes.MapRoute("Final", "Route/{*segments}",
new { controller = "Product", action = "View" });
नियंत्रक में, एक क्रिया जो इसे संभाल सकती है, वह हो सकती है:
public void ActionResult View(string[] segments /* <- the name of the parameter must match the name of the route parameter */)
{
// use the segments to obtain information about the product or category and produce data to the user
// ...
}
क्लाइंट-साइड रूटिंग को सक्षम करने के लिए कैच-ऑल रूट
यूआरएल में सिंगल पेज एप्लीकेशन (एसपीए) की स्थिति को एनकोड करना एक अच्छा अभ्यास है:
my-app.com/admin-spa/users/edit/id123
यह एप्लिकेशन स्थिति को सहेजने और साझा करने की अनुमति देता है।
जब उपयोगकर्ता ब्राउज़र के एड्रेस बार में url डालता है और सर्वर में प्रवेश करता है तो अनुरोधित यूआरएल के क्लाइंट-साइड हिस्से को अनदेखा करना चाहिए। यदि आप एक स्थैतिक HTML फ़ाइल के बजाय रेजर व्यू (नियंत्रक की कार्रवाई को कॉल करने का परिणाम) के रूप में अपने एसपीए की सेवा करते हैं, तो आप कैच-ऑल रूट का उपयोग कर सकते हैं:
public class AdminSpaController
{
[Route("~/admin-spa/{clienSidePart*}")]
ActionResult AdminSpa()
{
...
}
}
इस मामले में सर्वर सिर्फ एसपीए लौटता है, और फिर यह मार्ग के अनुसार खुद को इनिशियलाइज़ करता है। यह दृष्टिकोण अधिक लचीला है क्योंकि यह url-rewrite मॉड्यूल पर निर्भर नहीं करता है।
क्षेत्रों में रूटिंग की विशेषता
क्षेत्रों में विशेषता रूटिंग का उपयोग करने के लिए, पंजीकरण वाले क्षेत्रों और [RouteArea(...)]
परिभाषाओं की आवश्यकता होती है।
RouteConfig.cs
:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
AreaRegistration.RegisterAllAreas();
}
}
नमूना क्षेत्र नियंत्रक विशेषता रूटिंग परिभाषा में:
[RouteArea("AreaName", AreaPrefix = "AreaName")]
[RoutePrefix("SampleAreaController")]
public class SampleAreaController : Controller
{
[Route("Index")]
public ActionResult Index()
{
return View();
}
}
क्षेत्रों में Url.Action
लिंक का उपयोग करने के लिए:
@Url.Action("Index", "SampleAreaController", new { area = "AreaName" })