पथ के लिए नियंत्रक नहीं मिला या IController को लागू नहीं करता है


79

मेरे पास भाषा चयन के साथ MVC4 परियोजना है:

  • एन
  • nl
  • फादर
  • डे

1 मुख्य भाग के साथ:

  • के बारे में
  • आम (मेनू के लिए)
  • संपर्क करें
  • सामान्य प्रश्न
  • घर

और 3 क्षेत्र:

  • व्यवस्थापक
  • ग्राहकों
  • दुकान

प्रत्येक क्षेत्र में मेरे पास कम से कम एक नियंत्रक है, उदाहरण के लिए व्यवस्थापक I में संबंधित दृश्य फ़ोल्डर अवलोकन के साथ नियंत्रक अवलोकन है जिसमें एक index.aspx पृष्ठ है।

मुख पृष्ठ और सभी मुख्य पृष्ठ (के बारे में, faq, आदि) काम करते हैं और दौरा किया जा सकता है)।

हालाँकि, जब मैं यूआरएल का पालन करता हूं: लोकलहोस्ट: xxxx / en / व्यवस्थापक / अवलोकन मुझे त्रुटि मिलती है:

पथ '/ en / व्यवस्थापक / अवलोकन' के लिए नियंत्रक नहीं मिला या IController को लागू नहीं करता है।

भले ही मार्ग सही हो (मैं रूट डिबगर के साथ इसे देख सकता हूं), त्रुटि पृष्ठ यह भी दिखाता है कि जब मैं अपने मुख्य मेनू आइटम लोड करना चाहता था, तो त्रुटि फेंक दी गई थी:

<nav id="site-navigation" class="eightcol">
    @Html.Action("MenuItems", "Common")
</nav>

- अप्रासंगिक होने के कारण कोड हटाया गया -

सब कुछ क्रम में लगता है, लेकिन एमवीसी मेनू को लोड करने में सक्षम नहीं लगता है, जो मुख्य भाग में स्थित है।

तो, समस्या की जड़ यह है: क्या मैं अपनी परियोजना के मुख्य भाग (घर, आम, के बारे में आदि) में नियंत्रकों को एक क्षेत्र (उदाहरण के लिए प्रशासक) प्रदान कर सकता हूं?


क्या आपने Html को कॉल करने की कोशिश की है। विशेष नियंत्रक को समस्या को अलग करने के लिए।
जोनास हॉर्ग

मैं अभी तक नहीं था, लेकिन अब मैंने किया और जैसा मैंने सोचा था कि यह है। एरिया एडमिन लेआउट को मेरी परियोजना के मुख्य भाग से उपयोग करता है और जब यह एक्शन तक पहुँचता है तो क्षेत्र उस कंट्रोलर तक पहुंचने की कोशिश करता है जो उस क्षेत्र में स्थित नहीं है जो त्रुटि को फेंकता है। दूसरे शब्दों में, समस्या की जड़ यह है कि मैं अपनी परियोजना के मुख्य भाग (घर, आम, के बारे में, आदि नियंत्रकों) में नियंत्रकों के लिए एक क्षेत्र का उपयोग कैसे कर सकता हूं?
पुन :_पुनीक

2
सवाल अधिक संभावित समस्याओं और समाधान प्राप्त कर रहा है। इसलिए, मुझे लगता है कि अन्य उत्तरों को भी देखना चाहिए, न कि केवल एक को स्वीकार करना चाहिए।
एलिरेज़ा

जवाबों:


122

मैंने इसे पा लिया है।

जब कोई पृष्ठ, जो किसी क्षेत्र के अंदर स्थित होता है, तो एक नियंत्रक का उपयोग करना चाहता है जो इस क्षेत्र के बाहर स्थित है (जैसे कि एक साझा लेआउट पृष्ठ या एक अलग क्षेत्र के अंदर एक निश्चित पृष्ठ), इस नियंत्रक के क्षेत्र को जोड़ने की आवश्यकता है। चूंकि सामान्य नियंत्रक एक विशिष्ट क्षेत्र में नहीं है, लेकिन मुख्य परियोजना का हिस्सा है, इसलिए आपको क्षेत्र को खाली छोड़ना होगा:

@Html.Action("MenuItems", "Common", new {area="" }) 

उपरोक्त क्रिया को सभी क्रियाओं और क्रियाओं से जोड़ा जाना चाहिए क्योंकि लेआउट पृष्ठ को विभिन्न क्षेत्रों में साझा किया जाता है।

यह यहाँ की तरह ही समस्या है: साझा लेआउट के साथ ASP.NET MVC क्षेत्र

संपादित करें : स्पष्ट होने के लिए, यह उत्तर के रूप में चिह्नित है क्योंकि यह मेरी समस्या का उत्तर था। उपरोक्त उत्तर उसी त्रुटि को ट्रिगर करने वाले कारणों को हल कर सकते हैं।


11
धन्यवाद, कि मेरे लिए काम किया। यह .NET से एक बहुत ही भ्रामक त्रुटि संदेश है जो कह रहा है कि क्षेत्र के भीतर कार्रवाई के लिए नियंत्रक नहीं मिल सकता है, जो बिल्कुल भी ऐसा नहीं है!
रिचर्ड फॉसेट

1
इससे मेरा मुद्दा ठीक हो गया। मुझे लगता है कि अगली बार मुझे सूची के शीर्ष के बजाय हरे रंग के उत्तर के साथ शुरू करना चाहिए।
कैमरन बेल्ट

'@ Html.Action ("अबाउट", "होम", नया {क्षेत्र = ""})' रिक्त स्थान के रूप में निर्दिष्ट करते समय संकलन त्रुटि को फेंकता है। कोई सुझाव ?
थमराय टी

16

मेरे मामले में, वही त्रुटि एरिया से संबंधित नहीं थी, लेकिन मेरे मामले में हुई त्रुटि को पोस्ट करने के बारे में सोचा, जो इस धागे पर आने वाले लोगों के लिए सहायक हो सकता है "खोज के लिए पथ के लिए नियंत्रक नहीं मिला या IController को लागू नहीं करता है "

_Layout.cshtml फ़ाइल में गलत प्रविष्टि के कारण त्रुटि हुई थी।

@Styles.Render("~/Content/misc")

बंडल के नाम के साथ बंडल बंडल में हटा दिया गया था। लेकिन इसे _Layout.cshtml में निकालना भूल गया

यह मूर्खतापूर्ण था, लेकिन हम प्रोग्रामर हमेशा मूर्खतापूर्ण गलतियों के बहुत कुछ करते हैं :)


1
समाधान के लिए धन्यवाद। यह वास्तव में संभव है कि एक समान प्रतीत होने के लिए कई समाधान हैं लेकिन केवल एक समान समस्या है। हालांकि, जैसा कि मेरे प्रश्न में कहा गया है कि मैं उन क्षेत्रों का उपयोग करता हूं जो मेरे स्वयं के चयनित समाधान अभी भी सबसे सटीक हैं।
रीपर_ऑनिक 7

15

इसके अलावा, उन लोगों के लिए जो ऊपर दिए गए समाधान से काम नहीं करते हैं, यहां मेरे लिए काम किया गया है:

मेरे पास कई परियोजनाओं के साथ एक समाधान है। सभी प्रोजेक्ट MVC3 में थे। मैंने अपनी मशीन में विजुअल स्टूडियो 2012 स्थापित किया और ऐसा लगता है कि कुछ परियोजनाएं स्वचालित रूप से MVC4 में अपग्रेड हो गईं।

मुझे यह समस्या आई

पथ '/ etc / etc' के लिए नियंत्रक नहीं मिला या IController को लागू नहीं करता है

क्योंकि उस मार्ग को संभालने वाली परियोजना MVC4 की ओर इशारा कर रही थी।

मुझे MVC3 का उपयोग करने के लिए उनके संदर्भों को मैन्युअल रूप से अपडेट करना पड़ा। आप एक टेक्स्ट एडिटर के साथ .csproj फ़ाइल को खोलकर भी ऐसा कर सकते हैं। MVC3 का संदर्भ खोजें और इस लाइन को हटा दें:

<SpecificVersion>False</SpecificVersion>

2
हे भगवान। यह इतना यादृच्छिक और अस्पष्ट है। पोस्टिंग के लिए बहुत बहुत धन्यवाद! :) भविष्य के लेखक: मेरा केवल थोड़ा अलग था - dll संस्करण केवल 3.0 के बजाय 4.0 था - यकीन नहीं कि यह कैसे बदल गया।
जेयर्ड

मेरा साथ का मुद्दा भी ऐसा ही था; मेरे पास एक साझा पुस्तकालय था जिसे प्रस्तुति परत द्वारा संदर्भित किया गया था और इसमें एक साझा नियंत्रक था, और साझा पुस्तकालय mvc4 का उपयोग कर रहा था, जबकि प्रस्तुति परत mvc3 का उपयोग कर रही थी। एक बार जब मैंने साझा लाइब्रेरी को MVC3 में अपडेट किया, तो इसने इस मुद्दे को हल कर दिया।
जुकर

13

इस त्रुटि के लिए एक और संभावित मूल कारण यह है कि यदि क्षेत्र पंजीकरण वर्ग के लिए नाम स्थान नियंत्रक के लिए नाम स्थान से मेल नहीं खाता है।

नियंत्रक वर्ग पर सही नामकरण:

namespace MySystem.Areas.Customers
{
    public class CustomersController : Controller
    {
        ...
    }
}

क्षेत्र पंजीकरण वर्ग पर गलत नामकरण के साथ:

namespace MySystem.Areas.Shop
{
    public class CustomersAreaRegistration : AreaRegistration
    {
        ...
    }
}

(ऊपर नाम स्थान होना चाहिए MySystem.Areas.Customers।)

क्या मैं कभी भी कॉपी और पेस्ट कोड को रोकना सीखूंगा? शायद ऩही।


2
इसने मुझे पकड़ लिया और इसे ढूंढना मुश्किल था क्योंकि जब यह रूट कंट्रोलर फ़ोल्डर (किसी अन्य प्रोजेक्ट से कॉपी किया गया कोड) में नाम स्थान गलत था, लेकिन इससे पहले कि मैं इसे किसी क्षेत्र में ले जाता, इससे कोई फर्क नहीं पड़ता था।
रिचर्ड गार्साइड

12

यह त्रुटि इस तथ्य के कारण भी हो सकती है कि नियंत्रक के पास (उनके नाम में) शब्द होना चाहिए Controller; अर्थात HomeController:; जब तक आप अपना खुद का क्रियान्वयन नहीं करते ControllerFactory


2
यह मेरी गलती थी। धन्यवाद जॉर्ज!
विल्की

मुझे यह समस्या थी। ऐसा इसलिए था क्योंकि मैंने अपनी HomeController.cs फ़ाइल को हटा दिया था और मुझे समझ नहीं आया कि इस पर क्या निर्भर करता है।
user2023861

आप सीईओ हैं
डेनिस वेसल्स

12

मेरे मामले में, समस्या यह थी कि नियंत्रक वर्ग को सार्वजनिक रूप से घोषित नहीं किया गया है।

class WorkPlaceController : Controller

समाधान था

public class WorkPlaceController : Controller

7

मेरे मामले में namespacesपैरामीटर नियंत्रक के नाम स्थान से मेल नहीं खा रहा था।

public override void RegisterArea(AreaRegistrationContext context) 
{
    context.MapRoute(
        "Admin_default",
        "Admin/{controller}/{action}/{id}",
        new {controller = "Home", action = "Index", id = UrlParameter.Optional },
        namespaces: new[] { "Web.Areas.Admin.Controllers" }
    );
}

6

यहाँ मेरी समस्या और समाधान है कि मेरे लिए क्या काम किया।

मैंने एक नए नियंत्रक को एक एकल एक्शन के साथ जोड़ा जो एक मौजूदा एप्लिकेशन को एक स्ट्रिंग लौटाता है। लेकिन जब मैंने ब्राउज़र के माध्यम से उस नियंत्रक को नेविगेट किया, तो मुझे वही त्रुटि मिल रही थी जैसा कि ऊपर उल्लेखित है।

बहुत सारी गुगली करने के बाद, मुझे पता चला कि मुझे नए नियंत्रक को पहचानने के लिए अपनी Global.asax.cs फ़ाइल को संशोधित करना होगा। मेरे द्वारा किए गए सभी Global.asax.cs फ़ाइल में एक स्थान जोड़ा गया ताकि यह संशोधित हो और यह काम करे


हमारे पास 3 उत्पादन वेब सर्वर और 5 देव / परीक्षण मशीनें हैं। केवल एक उत्पादन मशीन पर यह काम नहीं कर रहा था। एक स्थान जोड़ने और Global.asax को बचाने के लिए इसे तय किया। #mindblown
jbwebtech

5

यह निश्चित नहीं है कि यह समाधान किसी अलग कोण से स्वीकृत उत्तर पर हिट करता है, लेकिन मैंने पाया कि एरिया सेक्शन में मेरा एक नियंत्रक गलत नाम स्थान पर बैठा था। नाम स्थान को ठीक करना:

Areas.{AreaName}.Controller

मेरे लिए मुद्दा तय किया।

मुझे लगता है कि प्रमुख कारक किसी दिए गए क्षेत्र के सभी नियंत्रकों को समान नाम स्थान साझा करना था।


काश आप पसंदीदा जवाब दे सकते थे और न सिर्फ सवाल। मैं इस जवाब पर कई बार ठोकर खा चुका हूं। यह सिर्फ इतना मददगार रहा है, धन्यवाद।
शेल्बी 115

5

इस त्रुटि का एक अन्य कारण: एक लेआउट फ़ाइल में Html.Action का आकस्मिक उपयोग जहां Html.ActionLink का इरादा हो सकता है। यदि Html.Action द्वारा संदर्भित दृश्य उसी लेआउट फ़ाइल का उपयोग करता है जिसे आपने प्रभावी रूप से एक अंतहीन लूप बनाया है। (लेआउट दृश्य आंशिक दृश्य के रूप में संदर्भित दृश्य को लोड करता है जो तब लेआउट दृश्य को लोड करता है जो संदर्भित दृश्य को लोड करता है ...) यदि आप लेआउट फ़ाइल में एक ब्रेकपॉइंट सेट करते हैं और Htlm के माध्यम से एकल चरण। यदि आपको कभी-कभी अधिक उपयोगी मिलेगा अत्यधिक स्टैक आकार के बारे में संदेश।


5

मेरे मामले में मेरे पास @{ Html.RenderAction("HeaderMenu", "Layout", new { Area = string.Empty }); }_Layout.cshtml था , लेकिन LayoutController मौजूद नहीं था! (मैंने एक अन्य समाधान से _Layout.cshtml की प्रतिलिपि बनाई थी, लेकिन नियंत्रक की प्रतिलिपि बनाना भूल गया)


4

Global.asax / application_start मेथड में मेरे मामले में, मैं वेब एपि मार्गों को mvc मार्गों जैसे दर्ज कर रहा था:

RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register);

आदेश को वापस लेते हुए मुद्दा तय किया

GlobalConfiguration.Configure(WebApiConfig.Register);            
RouteConfig.RegisterRoutes(RouteTable.Routes);

2

यदि आपके डिज़ाइन के लिए उपयुक्त है, तो आप यह सुनिश्चित कर सकते हैं कि आपके नियंत्रक वर्ग पर पहुँच संशोधक 'सार्वजनिक' है, न कि कुछ ऐसा जो 'आंतरिक' या 'निजी' जैसी पहुँच को सीमित कर सकता है।


2

शर्मनाक रूप से, मेरे मामले में समस्या यह है कि मैंने नियंत्रक को जोड़ने के बाद कोड का पुनर्निर्माण नहीं किया है

तो शायद जांच करने वाली पहली बात यह है कि आपका नियंत्रक बनाया गया था और बायनेरिज़ में मौजूद (और सार्वजनिक) है। अगर तुम मेरे जैसे हो तो यह आपको डिबगिंग के कुछ मिनट बचा सकता है।


1
बेशक यह मेरी समस्या थी ... यह हमेशा बेवकूफ चीजें हैं जो आपको मिलती हैं।
टीजे वोल्सचॉन

2

ऐसा इसलिए हो सकता है क्योंकि रास्ता गलत था। इसलिए पहले कंट्रोलर के पथ और वर्तनी की जांच करें। मेरे मामले में, मेरे नियंत्रक को CampsController नाम दिया गया था, और WebApiConfig.cs फ़ाइल में एक अतिरिक्त पथ था।

इसके बजाय: http: // localhost: 6600 / शिविर

यह था: http: // localhost: 6600 / एपीआई / शिविर

मैंने WebApiConfig.cs फ़ाइल में एपीआई शब्द नहीं देखा था:

config.Routes.MapHttpRoute(
          name: "DefaultApi",
          routeTemplate: "api/{controller}/{id}",
          defaults: new { id = RouteParameter.Optional }
      );

यह भी हो सकता है क्योंकि नियंत्रक को गलत नाम दिया गया था। यहाँ मैंने LayoutController कहा है, लेकिन इसके बजाय लेआउट कहा जाना चाहिए:

<a class="nav-link" href="#">@Html.Action("GetCurrentUser", "LayoutController" })</a>

होना चाहिए:

<a class="nav-link" href="#">@Html.Action("GetCurrentUser", "Layout")</a>

एक और उदाहरण, यह हो सकता है क्योंकि आपके पास खराब रूट पथ परिभाषित हैं। सुनिश्चित करें कि आपके रास्ते सही हैं। उदाहरण:

   [RoutePrefix("api/camps")]
   public class CampsController : ApiController

   [Route("{moniker}")]
   public async Task<IHttpActionResult> Get(string moniker)

1

एक अन्य परिदृश्य में, मैं सिर्फ यह जोड़ना चाहूंगा कि मेरे परिदृश्य में, नियंत्रक के लिए नाम स्थान अलग था क्योंकि यह किसी अन्य परियोजना से नियंत्रक की नकल करने की गलती थी।


1

विरासत के आवेदन के मेरे मामले में, समस्या तब हुई जब मैंने नोड के तहत web.config फ़ाइल में प्रविष्टि को नीचे जोड़ा <system.webServer>

       <modules runAllManagedModulesForAllRequests="true"></modules>

जब मैंने इसे हटा दिया, तो समस्या हल हो गई।


1

यदि आप .csproj फ़ाइलों में संकलन-प्रक्रिया के लिए अपने नियंत्रक वर्ग को शामिल नहीं करते हैं तो भी यह समस्या होती है।

<Compile Include="YOUR_CONTROLLER_PATH.cs" />

1

जॉर्ज के इस जवाब पर बिल्डिंग करते हुए , मैंने अपने मामले में पाया कि मैंने अपने कंट्रोलर को ठीक से सेट कर दिया ThingControllerथा और मेरे पास उस कंट्रोलर के बारे में ठीक से परिभाषित तरीका था।Edit

लेकिन .. मैं इसे अपने विचार से संदर्भित कर रहा था

<a href="https://stackoverflow.com/App/ThingController/Edit" />

जहाँ मुझे शब्द नियंत्रक के बिना नाम का उपयोग करना चाहिए था

<a href="https://stackoverflow.com/App/Thing/Edit" />


1

मेरे मामले में, मैं अपने मेन्यू सेक्शन के लिए _layout.cshtml फ़ाइल में @ Html.Ash ("Menu", "Menu") का उपयोग करके एक और एक्शन विधि प्रदान कर रहा था, जबकि मैं मेनू नियंत्रक बनाना भूल गया था और जैसा कि लेआउट फ़ाइल मेरे वर्तमान में उपयोग की जा रही थी कंट्रोलर एक्शन का दृश्य इसलिए मुझे अपने वर्तमान एक्शन रेंडर अनुरोध में यह त्रुटि हो रही थी। यदि आप एक ही गलती करते हैं तो अपने लेआउट में और साथ ही फ़ाइल को देखने का प्रयास करें


0

किसी ने इसे एक दृश्य में जोड़ दिया।

@Scripts.Render("~/bundles/jqueryval")

फिर उन्होंने BundleConfig.csफ़ाइल को App_Startफ़ोल्डर में जोड़ा ।
में RegisterBundlesविधि वे था:

bundles.Add(new ScriptBundle("~/bundles/jquery").Include("~/Scripts/jquery-{version}.js"));

हालाँकि , वे इसेGlobal.asax.csफ़ाइलमें वायरिंग समाप्त करना भूल गए।
ठीक करने के लिए, सभी मैं में जोड़ना था करना थाApplication_Startमें विधिGlobal.asax.cs:

RouteConfig.RegisterRoutes(RouteTable.Routes);

नोट: मुझे लगता है कि Application_Startविधि में इस लाइन के आदेश / प्लेसमेंट मायने रखता है,
इसलिए कृपया इसे ध्यान में रखें।
मैंने तुरंत उसके बाद उसे रख दिया ViewEngines


0

या हो सकता है कि आप नियंत्रक नाम के अंत में कीवर्ड "नियंत्रक" से चूक गए हों;)


0

मैं उम्मीद करता हूं कि इससे किसी की मदद होगी। मुझे यह समस्या थी, क्योंकि मेरे पास ठीक से नामित नियंत्रक था, फ़ाइल के अंदर की कक्षा में एक टाइपो था। मैं ऑर्डरश्रुक खोज रहा था और फ़ाइल ऑर्डरशर्चकंट्रोलर.कैंस थी, लेकिन क्लास ऑर्डर्स सर्चकंट्रोलर थी।

जाहिर है, उन्हें मेल खाना चाहिए, लेकिन उनके पास नहीं है, और आपका मार्ग वर्ग को लक्षित करता है, न कि फ़ाइलनाम को।

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