[C#] ‘Home’이라는 컨트롤러와 일치하는 여러 유형이 발견되었습니다.

현재 온라인으로 호스팅되는 두 개의 관련없는 MVC3 프로젝트가 있습니다.

하나는 잘 작동하고 다른 하나는 작동하지 않아 오류가 발생합니다.

‘Home’이라는 컨트롤러와 일치하는 여러 유형이 발견되었습니다. 이 요청을 처리하는 경로 ( ‘{controller} / {action} / {id}’)가 요청과 일치하는 컨트롤러를 검색 할 네임 스페이스를 지정하지 않은 경우 발생할 수 있습니다.

이 경우 ‘namespaces’매개 변수를 사용하는 ‘MapRoute’메서드의 오버로드를 호출하여이 경로를 등록하십시오.

내 호스트가 작동하는 방식은 FTP 액세스 권한을 부여하고 해당 폴더에는 각 응용 프로그램마다 하나씩 두 개의 다른 폴더가 있다는 것입니다.

ftpFolderA2 / foo.com

ftpFolderA2 / bar.com

foo.com은 정상적으로 작동하며 응용 프로그램을 로컬 파일 시스템에 게시 한 다음 FTP를 사용하여 작동합니다.

bar.com을 업로드하고 실행하려고하면 위의 문제가 발생하여 내 사이트를 사용하지 못하게됩니다. foo.com은 여전히 ​​작동합니다 .

bar.com이 ftpFolderA2 내부의 모든 컨트롤러에서 검색하고 있는데 이것이 다른 것을 찾는 이유 HomeController입니까? Controller 폴더 만 보도록하려면 어떻게해야합니까?

사리:

  1. 영역을 사용하지 않습니다. 이들은 완전히 관련이없는 두 프로젝트입니다. 게시 된 각 프로젝트를 각 해당 폴더에 배치합니다. 멋진 것은 없습니다.
  2. 각 프로젝트에는 1 개의 HomeController 만 있습니다.

누군가 이것이 이것이 문제인지 확인할 수 있습니까?



답변

이 오류 메시지 는 영역을 사용하고 해당 영역과 루트 내에 동일한 컨트롤러 이름 이있을 때 종종 발생 합니다. 예를 들어 두 가지가 있습니다.

  • ~/Controllers/HomeController.cs
  • ~/Areas/Admin/Controllers/HomeController.cs

오류 메시지에서 알 수 있듯이이 문제를 해결하기 위해 경로를 선언 할 때 네임 스페이스를 사용할 수 있습니다. 따라서 주요 경로 정의에서 Global.asax:

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

그리고 당신의 ~/Areas/Admin/AdminAreaRegistration.cs:

context.MapRoute(
    "Admin_default",
    "Admin/{controller}/{action}/{id}",
    new { action = "Index", id = UrlParameter.Optional },
    new[] { "AppName.Areas.Admin.Controllers" }
);

영역을 사용하지 않으면 두 응용 프로그램이 동일한 ASP.NET 응용 프로그램 내에서 호스팅되고 서로 다른 네임 스페이스에 동일한 컨트롤러가 정의되어 있기 때문에 충돌이 발생하는 것 같습니다. 이러한 종류의 충돌을 피하려면 IIS를 구성하여이 두 가지를 별도의 ASP.NET 응용 프로그램으로 호스팅해야합니다. 서버에 액세스 할 수없는 경우 호스팅 제공 업체에 문의하십시오.


답변

이 오류가 발생할 수있는 또 다른 시나리오는 다음과 같습니다. 어셈블리의 파일 이름이 변경되도록 프로젝트의 이름을 바꾸면 두 가지 버전의 ASP.NET 어셈블리가있을 수 있으며이 오류가 재현됩니다.

해결책은 bin폴더 로 이동 하여 이전 dll을 삭제하는 것입니다. ( “Rebuild Project”를 시도했지만 삭제하지 않았으므로 bin사라 졌는지 확인하십시오. )


답변

MVC4 및 MVC5에서는 조금 다릅니다. 다음을 사용하십시오.

/App_Start/RouteConfig.cs

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

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

그리고 지역에서

context.MapRoute(
                "Admin_default",
                "Admin/{controller}/{action}/{id}",
                new { action = "Index", id = UrlParameter.Optional },
                new[] { "MyNamespace.Areas.Admin.Controllers" }
            );


답변

이것을보십시오 … http://www.asp.net/mvc/videos/mvc-2/how-do-i/aspnet-mvc-2-areas

그런 다음이 그림 (내 그림처럼 u를 희망)

여기에 이미지 설명을 입력하십시오


답변

다른 사람들이 말한 것은 올바르지 만 여전히 같은 문제에 직면하는 사람들을 위해 :
나는 다른 프로젝트를 복사하기 때문에 내 경우에 무슨 일이 있었 N 뭔가에 이름 하지만 에 이전 출력 파일 bin불행하게도, 타격 폴더 여전히 있었다 … 그리고 Build -> Clean Solution이름을 바꾼 후 프로젝트와 그것으로 Namespaces 제거되지 않습니다 … 그래서 수동으로 삭제 하면 내 문제가 해결되었습니다!


답변

프로젝트 bin/폴더에

PROJECT_PACKAGENAME.DLL 만 가지고 있는지 확인하십시오

ANOTHER_PROJECT_PACKAGENAME.DLL을 제거 하십시오.

실수로 여기에 표시되거나 프로젝트 이름을 바꿉니다.


답변

homeController 클래스와 충돌 할 수있는 다른 dll 파일이 있으면 bin 폴더를 확인하십시오 .