2012-01-20 15 views
8

मैंने 2 नियंत्रकों, HomeController और OtherController के साथ अन्यथा खाली एएसपी.नेट एमवीसी 3 एप्लिकेशन बनाया है।आपको HTML.Action के लिए परिभाषित रूट की आवश्यकता क्यों है?

HomeController.cs इस तरह दिखता है:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

Index.cshtml इस तरह दिखता है:,

@Html.Action("Index", "Other") 

और बेशक, Othercontroller.cs:

public class OtherController : Controller 
{ 
    [ChildActionOnly] 
    public ActionResult Index() 
    { 
     return Content("OK!"); 
    } 
} 

अब तक , बहुत अच्छा। मैं अनुप्रयोग चलाने, और यह मुझे सब कुछ है OK!

अब, मैं डिफ़ॉल्ट RegisterRoutes Global.asax.cs से ले बताता है:

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

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

और मैं यह पड़ना अप, ताकि कोई मार्गों OtherController से मेल खाते हैं:

System.InvalidOperationException: No route in the route table matches the supplied values. 
Source Error: 
Line 1: @Html.Action("Index", "Other") 
:

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

     routes.MapRoute("Default", "", new { controller = "Home", action = "Index" }); 
    } 

अब, जब मैं पेज चलाने के लिए, यह इस त्रुटि संदेश के साथ दुर्घटनाओं

मैंने .Action पर कॉल में नियंत्रक का नाम और क्रिया का नाम निर्दिष्ट किया। कोई यूआरएल उत्पन्न नहीं हो रहा है, और कोई अनुरोध नहीं किया जा रहा है। रूटिंग को शामिल करने की भी आवश्यकता क्यों है?

उत्तर

4

मुझे लगता है कि इस ब्लॉग पोस्ट आप एक छोटे से अधिक समझने में मदद मिलेगी:

http://blogs.charteris.com/blogs/gopalk/archive/2009/01/20/how-does-asp-net-mvc-work.aspx

अनिवार्य रूप से, रूटिंग यह निर्धारित करने में शामिल है कि कौन सा नियंत्रक अनुरोध को संभालने के लिए 'आग लगाना' और आपके द्वारा भेजे गए पैरामीटर के आधार पर आमंत्रित करने के लिए उचित कार्रवाई और एमवीसीआरओटीएंडलर निर्णय लेने के लिए उपयोग करता है। सिर्फ इसलिए कि आप इसे बताते हैं कि आपकी कार्रवाई में कौन सा नियंत्रक इसे रूटिंग टेबल को जादुई रूप से अनदेखा नहीं करता है, सीधे उस नियंत्रक वर्ग पर जाएं और बैक एंड में होने वाली अन्य सभी एमवीसी भलाई को बाईपास करें। याद रखें, ये @HTML.Action विधियां पूरी तरह से अधिभार ले सकती हैं जो रूटिंग तालिका में किस मार्ग का उपयोग करने के लिए प्रभावित कर सकती हैं (उदाहरण के लिए यूआरएल संरचना सोचें)।

एमवीसी पथ स्थैतिक सामग्री के लिए नहीं हैं और इस तरह, URLRoutingModule के माध्यम से पार्स किया जाना है जो यह तय करने के लिए रूटिंग तालिका का उपयोग करता है कि क्या करना है। चूंकि आपके पास कोई मिलान करने वाला मार्ग नहीं है - आपको एक त्रुटि मिलती है।

संपादित

मेरी आक्षेप में, मैं वास्तव में अपने अंतिम बयान को संबोधित नहीं किया। आप सही हैं, कोई यूआरएल उत्पन्न नहीं हुआ था, लेकिन आवेदन के लिए अनुरोध उत्पन्न हुआ था। एचटीएमएल।कार्रवाई अभी भी नियंत्रक, क्रिया, क्षेत्र, पैरामीटर का उपयोग करने के लिए निर्धारित करने के लिए रूटिंग का उपयोग करेगा। मुझे लगता है कि सरल शब्दों में यह कहना उचित होगा कि यह एक एक्शनलिंक उत्पन्न करने और आपके लिए इसे क्लिक करने जैसा है।

+0

धन्यवाद

मैं निम्न पंक्ति है कि मुझे एक त्रुटि दे रहा था था आप। यह एक अधिभार का एक विशिष्ट उदाहरण देने में मदद कर सकता है जो कि किस मार्ग का उपयोग करने के लिए प्रभावित करेगा। क्या आप एक साधारण के बारे में सोच सकते हैं? –

+1

घर के अंत में देर से घंटों में (यम, वाइन) दिमाग में आने वाला पहला व्यक्ति आपके मार्ग मूल्य शब्दकोश में एक क्षेत्र का उपयोग करेगा। मार्ग हैंडलर के बिना, एमवीसी कैसे पता लगाएगा कि किस नेमस्पेस को नियंत्रक की तलाश है या यदि यह किसी क्रिया के लिए पैरामीटर था। -> @ एचटीएमएल। एक्शन ("एक्शन", "कंट्रोलर", नया {क्षेत्र = "एडमिन"})। इसके अलावा, नामित मार्ग एक और उदाहरण हो सकते हैं, जहां आप बस मार्ग का नाम पारित करते हैं और आवश्यक रूप से नियंत्रक, क्रिया पैरामीटर को पास करने की आवश्यकता नहीं होती है क्योंकि उन्हें नामित मार्ग परिभाषा में परिभाषित किया जा सकता है। – Tommy

0

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

InvalidOperationException The required virtual path data cannot be found.

http://msdn.microsoft.com/en-us/library/ee721266.aspx

0

मेरे लिए समाधान इस प्रकार थी:

@{Html.RenderAction("ActionName", "ControllerName");} 

एक तृतीय पैरामीटर जोड़ना त्रुटि हल:

@{Html.RenderAction("ActionName", "ControllerName", new { area = string.Empty });} 
संबंधित मुद्दे