경로에 대한 컨트롤러를 찾을 수 없거나 IController를 구현하지 않습니다.


79

언어 선택이 가능한 MVC4 프로젝트가 있습니다.

  • ko
  • nl
  • fr

주요 부분 1 개 :

  • 공통 (메뉴 용)
  • 접촉
  • 자주하는 질문

그리고 3 가지 영역 :

  • 관리자
  • 고객
  • 가게

각 영역에는 하나 이상의 컨트롤러가 있습니다. 예를 들어 Admin 에는 index.aspx 페이지 가 포함 된 해당 뷰 폴더 개요 가있는 컨트롤러 개요 가 있습니다 .

홈페이지와 모든 메인 페이지 (about, faq 등)가 작동하며 방문 할 수 있습니다.

그러나 URL : localhost : xxxx / en / admin / overview를 따를 때 오류가 발생합니다.

'/ en / admin / overview'경로에 대한 컨트롤러를 찾을 수 없거나 IController를 구현하지 않습니다.

경로가 정확하더라도 (Route Debugger로 확인할 수 있음) 오류 페이지에는 주 메뉴 항목을로드하려고 할 때 오류가 발생했다고 표시됩니다.

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

-관련성이 없기 때문에 코드 제거-

모든 것이 정상인 것 같지만 MVC는 메인 부분에있는 메뉴를로드 할 수없는 것 같습니다.

따라서 문제의 원인은 다음과 같습니다. 프로젝트의 주요 부분 (홈, 공통, 정보 등)에있는 컨트롤러에 영역 (예 : 관리자) 액세스 권한을 부여 할 수 있습니까?


Html.Action에 대한 호출을 주석 처리하여 문제를 특정 컨트롤러로 격리 해 보셨습니까?
Jonas Høgh

나는 아직하지 않았지만 지금은 내가 생각한대로입니다. Area Admin 은 내 프로젝트의 주요 부분의 레이아웃을 사용하고 Action에 도달하면 영역에서 오류가 발생한 영역에 있지 않은 컨트롤러에 액세스하려고 시도합니다. 즉, 문제의 근본 원인은 프로젝트의 주요 부분 (홈, 공통, 정보 등)에있는 컨트롤러에 영역 액세스 권한을 부여 할 수있는 방법입니다.
reaper_unique dec

2
문제는 더 많은 가능한 문제와 해결책을 얻는 것입니다. 따라서 유일하게 받아 들여진 답변이 아니라 다른 답변도 살펴 봐야한다고 생각합니다.
Alireza

답변:


122

찾았습니다.

영역 내부에있는 페이지가이 영역 외부에있는 컨트롤러 (예 : 공유 레이아웃 페이지 또는 다른 영역 내부의 특정 페이지)에 액세스하려는 경우이 컨트롤러의 영역을 추가해야합니다. 공통 컨트롤러는 특정 영역이 아니라 주 프로젝트의 일부이므로 영역을 비워 두어야합니다.

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

레이아웃 페이지는 다양한 영역에서 공유되므로 위의 모든 작업 및 작업 링크에 추가해야합니다.

여기와 똑같은 문제입니다 : 공유 레이아웃이있는 ASP.NET MVC 영역

편집 : 명확하게 말하면 이것이 내 문제에 대한 답 이었기 때문에 답으로 표시되었습니다. 위의 답변은 동일한 오류를 유발하는 원인을 해결할 수 있습니다.


11
고마워요. .NET에서 해당 영역 내의 작업에 대한 컨트롤러를 찾을 수 없다는 매우 잘못된 오류 메시지입니다. 이는 전혀 사실이 아닙니다!
Richard Fawcett 2014 년

1
이것은 내 문제를 해결했습니다. 다음에 목록 상단이 아닌 녹색 확인 답변으로 시작해야 할 것 같습니다.
Cameron Belt

'@ Html.Action ( "About", "Home", new {area = ""})'를 빈 영역으로 지정할 때 컴파일 오류가 발생합니다. 어떤 제안?
Thamarai T

16

제 경우에는 같은 오류가 Area와 관련이 없었지만 제 경우에 발생한 오류를 게시하려고 생각했습니다. "경로에 대한 컨트롤러를 찾을 수 없거나 IController를 구현하지 않습니다. "

_Layout.cshtml 파일의 잘못된 항목으로 인해 오류가 발생했습니다.

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

해당 이름의 번들이 BundleConfig.cs에서 제거되었지만 _Layout.cshtml에서 제거하는 것을 잊었습니다.

바보 같았지만 우리 프로그래머들은 항상 바보 같은 실수를 많이 해요 :)


1
솔루션에 감사드립니다. 겉보기에는 동일 해 보이지만 실제로는 유사한 문제에 대한 여러 솔루션이있을 수 있습니다. 그러나 내 질문에 내가 선택한 솔루션이 여전히 가장 정확합니다.
reaper_unique

15

또한 위의 솔루션이 작동하지 않는 사람들을 위해 다음은 나를 위해 일한 것입니다.

여러 프로젝트에 대한 솔루션이 있습니다. 모든 프로젝트는 MVC3에있었습니다. 내 컴퓨터에 Visual Studio 2012를 설치했는데 일부 프로젝트가 MVC4로 자동 업그레이드 된 것 같습니다.

나는이 문제가있다

'/ etc / etc'경로에 대한 컨트롤러를 찾을 수 없거나 IController를 구현하지 않습니다.

해당 경로를 처리 한 프로젝트가 MVC4를 가리키고 있었기 때문입니다.

MVC3를 사용하려면 참조를 수동으로 업데이트해야했습니다. 텍스트 편집기로 .csproj 파일을 열어서 그렇게 할 수도 있습니다. MVC3에 대한 참조를 찾고 다음 줄을 제거하십시오.

<SpecificVersion>False</SpecificVersion>

2
이런. 너무 무작위적이고 모호합니다. 게시 해 주셔서 감사합니다! :) 미래 독자 : 저의 dll 버전은 3.0이 아니라 4.0이었습니다. 어떻게 변경되었는지 확실하지 않습니다.
Jared

저의 문제는 비슷했습니다. 프레젠테이션 레이어에서 참조하고 공유 컨트롤러를 포함하는 공유 라이브러리가 있었고 공유 라이브러리는 mvc4를 사용하고있는 반면 프레젠테이션 레이어는 mvc3를 사용했습니다. 공유 라이브러리를 MVC3로 업데이트하면 문제가 해결되었습니다.
jbooker

13

이 오류의 또 다른 가능한 근본 원인은 영역 등록 클래스의 네임 스페이스가 컨트롤러의 네임 스페이스와 일치하지 않는 경우입니다.

예 : 컨트롤러 클래스에서 올바른 이름 지정 :

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

지역 등록 클래스에 잘못된 이름 지정 :

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

(위의 네임 스페이스는이어야합니다 MySystem.Areas.Customers.)

코드 복사 및 붙여 넣기를 중지하는 방법을 배울 수 있습니까? 아마 아닐 것입니다.


2
이것은 나를 잡았고 네임 스페이스가 루트 컨트롤러 폴더 (다른 프로젝트에서 복사 된 코드)에있을 때 잘못 되었기 때문에 찾기 어려웠지만 영역으로 이동하기 전에는 중요하지 않았습니다.
Richard Garside 2018 년

12

이 오류는 컨트롤러가 (이름에) 단어를 가지고 있어야한다는 사실로 인해 발생할 수도 있습니다 Controller. 즉 : HomeController; 자신의 ControllerFactory.


2
제 실수였습니다. 감사합니다 George!
Wilky

나는이 문제가 있었다. 내 HomeController.cs 파일을 삭제했는데 그 파일에 무엇이 의존하는지 이해하지 못했기 때문입니다.
user2023861

당신은 CEO 있습니다
데니스 Wessels가

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 섹션의 컨트롤러 중 하나가 잘못된 네임 스페이스에 앉아 있음을 발견했습니다. 네임 스페이스를 다음으로 수정 :

Areas.{AreaName}.Controller

나를 위해 문제를 해결했습니다.

핵심 요소는 주어진 영역 내의 모든 컨트롤러가 동일한 네임 스페이스를 공유하도록하는 것이 었습니다.


질문뿐만 아니라 좋아하는 답변을 원합니다. 나는이 대답을 여러 번 다시 우연히 만났습니다. 정말 도움이 됐어요, 감사합니다.
Shelby115

5

이 오류의 또 다른 원인 : Html.ActionLink가 의도되었을 수있는 레이아웃 파일에서 실수로 Html.Action을 사용했습니다. Html.Action에서 참조하는 뷰가 동일한 레이아웃 파일을 사용하는 경우 효과적으로 무한 루프를 만든 것입니다. (레이아웃보기는 참조 된보기를 부분보기로로드 한 다음 참조 된보기를로드하는 레이아웃보기를로드합니다 ...) 레이아웃 파일에 중단 점을 설정하고 Htlm.Action을 통해 한 단계를 수행하면 때때로 더 유용한 정보를 얻을 수 있습니다. 과도한 스택 크기에 대한 메시지.


5

제 경우 @{ Html.RenderAction("HeaderMenu", "Layout", new { Area = string.Empty }); }에는 _Layout.cshtml에 있었지만 LayoutController는 존재하지 않았습니다! (다른 솔루션에서 _Layout.cshtml을 복사했지만 컨트롤러를 복사하는 것을 잊었습니다)


4

제 경우에는 global.asax / application_start 메소드에서 mvc 경로 이후에 웹 API 경로를 등록했습니다.

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

주문을 되 돌리면 문제가 해결되었습니다.

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

2

디자인에 적절하다면 컨트롤러 클래스의 액세스 수정자가 '내부'또는 '개인'과 같은 액세스를 제한 할 수있는 것이 아니라 '공개'인지 확인할 수 있습니다.


2

당황스럽게도 제 경우의 문제 는 컨트롤러를 추가 한 후 코드를 다시 빌드하지 않았다는 것 입니다.

따라서 가장 먼저 확인해야 할 것은 컨트롤러가 빌드되었고 바이너리에 존재 (및 공개)되어 있다는 것입니다. 나와 같은 경우 디버깅 시간을 몇 분 절약 할 수 있습니다.


1
물론 그게 내 문제 였어. 당신을 얻는 것은 항상 어리석은 것들입니다.
TJ Wolschon

2

경로가 잘못 되었기 때문일 수 있습니다. 따라서 먼저 컨트롤러의 경로와 철자를 확인하십시오. 필자의 경우 컨트롤러 이름은 CampsController이고 WebApiConfig.cs 파일에는 추가 경로가 있습니다.

대신 : http : // localhost : 6600 / Camps

http : // localhost : 6600 / api / Camps였습니다.

WebApiConfig.cs 파일에서 api 단어를 발견하지 못했습니다.

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

또한 컨트롤러 이름이 잘못 되었기 때문일 수도 있습니다. 여기서는 LayoutController를 호출했지만 대신 Layout을 호출해야합니다.

<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

George 의이 답변 을 바탕으로 컨트롤러를 올바르게 설정 ThingController했으며 해당 컨트롤러에 대해 올바르게 정의 된 메서드가 있음을 발견했습니다.Edit .

하지만 .. 내 관점에서

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

컨트롤러라는 단어없이 이름 만 사용 했어야했는데

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


1

제 경우에는 @ Html.Action ( "Menu", "Menu")를 사용하여 _layout.cshtml 파일의 메뉴 섹션에 대한 또 다른 작업 방법을 렌더링했지만 메뉴 컨트롤러를 만드는 것을 잊었고 레이아웃 파일이 현재 사용 중이었습니다. 따라서 컨트롤러 작업의보기에서는 현재 작업 렌더링 요청에서이 오류가 발생했습니다. 같은 실수를했다면 레이아웃과 파일보기를 시도하십시오.


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

또는 컨트롤러 이름 끝에 "Controller"키워드를 놓쳤을 수도 있습니다.)


0

다른 사람에게 도움이되기를 바랍니다. 이 문제는 컨트롤러 이름이 제대로 지정되었지만 파일 내부의 클래스에 오타가 있었기 때문에 발생했습니다. OrderSearch를 찾고 있었고 파일은 OrderSearchController.cs 였지만 클래스는 OrdersSearchController였습니다.

분명히 일치해야하지만 반드시 일치해야하는 것은 아니며 경로는 파일 이름이 아닌 클래스를 대상으로합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.