내 프로젝트에서 같은 이름의 여러 컨트롤러에 문제가 있습니다.


96

내 ASP.NET MVC 3 프로젝트에서 다음 오류가 발생합니다.

'Home'이라는 컨트롤러와 일치하는 여러 유형이 발견되었습니다. 이 요청을 서비스하는 경로 ( 'Home / {action} / {id}')가 요청과 일치하는 컨트롤러를 검색하기위한 네임 스페이스를 지정하지 않는 경우에 발생할 수 있습니다. 이 경우 'namespaces'매개 변수를 사용하는 'MapRoute'메소드의 오버로드를 호출하여이 경로를 등록하십시오.

'Home'에 대한 요청에서 일치하는 컨트롤러 MyCompany.MyProject.WebMvc.Controllers.HomeController MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController를 찾았습니다.

기본 컨트롤러 폴더에 클래스 이름이 MyCompany.MyProject.WebMvc.Controllers.HomeController 인 HomeController가 있습니다.

내 global.asax의 RegisterRoutes 메서드는 다음과 같습니다.

    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
        );
    }

그런 다음 Company라는 영역이 있고 해당 영역의 기본 컨트롤러 폴더에 HomeController가 있고 클래스 이름은 MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController입니다.

CompanyAreaRegistration 파일의 RegisterArea 메서드는 다음과 같습니다.

   public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Company_default",
            "Company/{controller}/{action}/{id}",
            new { area = "Company", action = "Index", id = UrlParameter.Optional }
        );
    }

이 모든 것이이 게시물의 시작 부분에서 강조한 오류의 원인입니다. 나는 운이없는 다양한 다른 게시물의 솔루션을 모 으려고 고군분투하고 있습니다.

기본 컨트롤러 폴더에 HomeController가 있고 각 영역에 하나가있을 수 있습니까? 그렇다면이 작업을 수행하려면 내 구성 파일을 변경해야합니까?

어떤 도움이라도 대단히 감사하겠습니다!


stackoverflow.com/a/12633541/2089963을 참조하십시오 . 그것은 나를 위해 작동
에드 모하메드에게

이것은 프로젝트 / 어셈블리의 이름을 바꿀 때 발생하며, 방금 bin 폴더를 삭제하고 프로젝트를 다시 컴파일하면 정상적으로 작동합니다.
Core

답변:


167

오류 메시지에는 권장 솔루션이 포함되어 있습니다. "이 경우 'namespaces'매개 변수를 사용하는 'MapRoute'메소드의 오버로드를 호출하여이 경로를 등록하십시오."

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

이렇게하면 http : // server / 가 HomeController의 인덱스 작업으로 이동합니다. http : // server / company / home 은 영역 등록에 정의 된대로 회사 영역의 HomeController의 인덱스 작업으로 이동합니다.


1
나는 그것을 테스트하지 않은,하지만 namespaces당신은 배열에 추가하여 번호를 통과 할 수 있어야하므로 매개 변수는 문자열 배열입니다 :new string[] { "MyCompany.MyProject.WebMvc.Controllers", "My.Second.Namespace", "My.Third.Namespace", "Namespaces.Etc" }
데이비드 Ruttka

2
그 네임 스페이스 패턴은 나를 위해 작동하지 않았습니다. MyProject.Controllers그러나했다.
머핀 맨

나는 이것을 시도했다. 그러나이 MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController클래스 의 인덱스 는 실행 중입니다. 그러나보기는 오래된 것입니다.
kbvishnu

여기에있는 4 번째 매개 변수가 유형 추론과 변수 의미로 인해 약간 혼란 스러울 수 있다는 것은 가치가 없습니다. 네 번째 매개 변수는 네임 스페이스로 제한 할 문자열 배열, IRouteConstraints를 추가하는 개체 또는 제약 조건으로 해석 될 수있는 문자열이거나 5 개의 매개 변수를 갖고 둘 다 포함 할 수 있습니다. aspnetwebstack.codeplex.com/SourceControl/changeset/view/…
Chris Moschini

또한 경로는 기본적으로 다른 네임 스페이스로가는 길을 찾을 수 있습니다. 네임 스페이스 또는 네임 스페이스 집합에 대한 경로를 잠 그려면이 폴백을 비활성화해야합니다. bubblogging.wordpress.com/2012/06/09/mvc- 라우팅 네임 스페이스 (페이지 하단)
Chris Moschini 2013 년

30

이것은 asp.net mvc4 접근 방식입니다.

 routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "RegisterNow", id = UrlParameter.Optional },
            namespaces: new[] { "YourCompany.Controllers" }
        );

2
고마워, 이것은 나를 위해 해결되었지만 내 응용 프로그램이 처음에 두 개의 홈 컨트롤러가 있다고 생각하는 이유를 내 인생에서 알 수는 없습니다. 문제를 일으킨 것으로 보이는 네임 스페이스를 검색 및 교체했지만 전체 솔루션을 검색해도 불량 네임 스페이스의 인스턴스가 표시되지 않습니다.
Yann Duran

12
음, 문제의 원인을 찾았습니다. 내가 오늘처럼 필사적으로 찾는 다른 사람에게 도움이되기를 바랍니다. 응용 프로그램의 이름 (네임 스페이스 포함)을 변경했기 때문에 정리에 의해 삭제되지 않은 DLL이 bin 폴더에 남아 있습니다. 덮개 아래에서 진행되는 MEF 마술이있을 것입니다. 이전 DLL을 발견하고 삭제하자마자 문제가 사라졌습니다. 텍스트 검색에서 찾지 못한 것은 당연합니다!
Yann Duran

@YannDuran, 비슷한 문제가 발생하여 수정이 도움이되었습니다. 감사.
Klaus Nji 2013-08-03

12

이름 공간의 이름을 변경 했으므로 binobj 폴더 만 삭제 하고 다시 작성 하고 다시 작업합니다.



2

이것을 사용하십시오

routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            new[] { "ProjectName.Controllers" }
        );

1

프로젝트 이름 만 사용하십시오.

Public Class RouteConfig
    Public Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
        routes.MapRoute( _
            name:="Default", _
            url:="{controller}/{action}/{id}", _
            defaults:=New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional} _
           , namespaces:={"MvcAreas"})  
    End Sub

1

RazorGenerator를 사용하는 경우 namespaces매개 변수를 알리는 것만 으로는 충분하지 않을 수 있습니다.

아래에 표시된 문을 추가하여 해결해야합니다 Global.asax.cs.

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        ControllerBuilder.Current.DefaultNamespaces.Add("MyProject.Controllers"); // This one
    }

0

Chris Moschini가 언급했듯이 네임 스페이스가 다른 동일한 컨트롤러 이름을 가진 두 영역이 있고 기본 없음 영역 경로가 500 서버 오류를 반환하는 경우 네임 스페이스 매개 변수가 충분하지 않을 수 있습니다.

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

기본 경로 처리기를 재정의하고 다음 줄을 추가하는 것이 "최적"입니다.

RequestContext.RouteData.DataTokens["UseNamespaceFallback"] = false;

0

동일한 경로를 가진 다른 프로젝트에 대한 참조를 추가 한 후이 문제가 발생했으며 참조를 제거한 후에도 문제가 계속되었습니다.

bin 폴더에서 추가 된 참조의 .dll 파일을 삭제하고 다시 빌드하여 문제를 해결했습니다.


0

다른 많은 사람들과 마찬가지로 VS2017 메뉴에서 새 MVC 템플릿 프로젝트를 만든 후이 문제가 발생했습니다. 프로젝트를 빌드 할 때 작업 오류 메시지가 표시됩니다. 나는 그 대답 사용 https://stackoverflow.com/a/15651619/2417292 에 의해 이전이 스레드에 게시 cooloverride mvc4 프로젝트를. 이것은 여전히 ​​내 문제를 해결하지 못했기 때문에 내 홈 뷰 폴더와 HomeController 파일의 이름을 Company / 및 컨트롤러 파일 CompanyController로 변경했습니다. 이것은 나를 위해 일했지만 말 당 수정은 아니지만 경로 홈 / 인덱스에 붙어 있지 않은 경우 다른 문제는 오류를 일으키는 참조를 찾을 수 없었고 내 개발 플랫폼이 Azure WebApplication 대 ​​a 완전한 파일 시스템과 IIS 설정을 갖춘 전체 VM.


0

동일한 문제가 발생하여 이전 버전이 "bin"폴더에 컴파일 된 파일을 생성했음을 발견했습니다.

이것을 삭제하면 오류가 사라졌습니다.

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