Tendo problemas com vários controladores de mesmo nome em meu projeto

96

Estou tendo o seguinte erro com meu projeto ASP.NET MVC 3:

Vários tipos foram encontrados que correspondem ao controlador chamado 'Home'. Isso pode acontecer se a rota que atende a esta solicitação ('Home / {action} / {id}') não especificar namespaces para procurar um controlador que corresponda à solicitação. Se for esse o caso, registre essa rota chamando uma sobrecarga do método 'MapRoute' que leva um parâmetro de 'namespaces'.

A solicitação de 'Home' encontrou os seguintes controladores correspondentes: MyCompany.MyProject.WebMvc.Controllers.HomeController MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController

Eu tenho um HomeController na minha pasta de controlador padrão, com um nome de classe de MyCompany.MyProject.WebMvc.Controllers.HomeController.

Meu método RegisterRoutes, em meu global.asax, é semelhante a:

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

Tenho então uma área chamada Company, com um HomeController na pasta do controlador padrão para a área, com o nome de classe MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController.

O método RegisterArea no arquivo CompanyAreaRegistration se parece com:

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

Isso tudo está levando ao erro que destaquei no início desse post. Estou lutando para encontrar uma solução de vários outros posts, sem SORTE .

É possível ter um HomeController na pasta de controladores padrão e outro em CADA área? Em caso afirmativo, preciso fazer (presumindo que sim) alterações em meu arquivo de configuração para que isso funcione?

Qualquer ajuda seria muito apreciada!

Mattruma
fonte
Consulte stackoverflow.com/a/12633541/2089963 . Funciona para mim
Syed Mohamed
Isso aconteceu comigo quando eu renomei o projeto / montagem, eu apenas apaguei a pasta bin e recompilei o projeto e funcionou bem.
Core

Respostas:

167

A mensagem de erro contém a solução recomendada: "Se for este o caso, registre esta rota chamando uma sobrecarga do método 'MapRoute' que leva um parâmetro de 'namespaces'."

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

Isso fará com que http: // server / vá para a ação Index do seu HomeController, que é, eu acho, o que você deseja. http: // servidor / empresa / home irá para a ação Índice do HomeController da área Empresa, conforme definido no cadastro da área.

David Ruttka
fonte
1
Eu não testei, mas o namespacesparâmetro é um array de string, então você deve ser capaz de passar qualquer número adicionando ao array:new string[] { "MyCompany.MyProject.WebMvc.Controllers", "My.Second.Namespace", "My.Third.Namespace", "Namespaces.Etc" }
David Ruttka
2
Esse padrão de namespace não funcionou para mim. MyProject.Controllersfez entretanto.
The Muffin Man
Eu tentei este. Mas o índice desta MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeControllerclasse está em execução. Mas a visão que aparece é a antiga.
kbvishnu
Não vale a pena que o 4º parâmetro aqui possa ser um pouco confuso por causa da inferência de tipo e significado da variável. O quarto parâmetro pode ser uma matriz de string para restringir por namespace, um objeto para adicionar IRouteConstraints OU strings que podem ser interpretadas como restrições, ou você pode ter 5 parâmetros e incluir ambos. aspnetwebstack.codeplex.com/SourceControl/changeset/view/…
Chris Moschini
Também vale a pena observar que um caminho encontrará seu caminho para outros namespaces por padrão - se você quiser bloquear um caminho para um namespace ou conjunto de namespaces, deverá desativar este fallback: bubblogging.wordpress.com/2012/06/09/mvc- namespaces de roteamento (parte inferior da página)
Chris Moschini
30

Esta é a abordagem asp.net mvc4:

 routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "RegisterNow", id = UrlParameter.Optional },
            namespaces: new[] { "YourCompany.Controllers" }
        );
cooloverride
fonte
2
obrigado, isso resolveu para mim, embora eu não consiga descobrir por que meu aplicativo pensa que há dois controladores domésticos em primeiro lugar. Fiz uma pesquisa e substituição do namespace, o que parece ter causado o problema, mas uma pesquisa de toda a solução não mostra nenhuma instância do namespace não autorizado.
Yann Duran
12
Bem, eu encontrei a causa do meu problema. Esperançosamente, isso pode ajudar alguém procurando desesperadamente, como eu estava hoje. Como eu alterei o nome do aplicativo (assim como o namespace), ainda havia uma DLL deixada na pasta bin que não foi excluída por um clean. Deve haver alguma magia MEF acontecendo sob as cobertas. Assim que descobri e excluí a DLL antiga, o problema foi embora. Não é de admirar que uma pesquisa de texto não tenha encontrado!
Yann Duran
@YannDuran, teve um problema semelhante e sua solução ajudou. Obrigado.
Klaus Nji
12

Eu tinha renomeado os namespaces, então, eu apenas excluo as pastas bin e obj e recompilo , trabalho novamente.

Reynaldo
fonte
2

usa isto

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

Use apenas o nome do projeto:

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
glownet
fonte
1

Se você estiver usando RazorGenerator, apenas informar o namespacesparâmetro pode não ser suficiente.

Eu consegui resolver adicionando a declaração marcada abaixo em 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
    }
Leonel Sanches da Silva
fonte
0

Como Chris Moschini mencionou, o parâmetro namespaces pode não ser suficiente se você tiver duas áreas com o mesmo nome de controlador com namespaces diferentes e a rota de nenhuma área padrão retornará 500 erro de servidor.

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

É "melhor" substituir o manipulador de rota padrão e adicionar esta linha:

RequestContext.RouteData.DataTokens["UseNamespaceFallback"] = false;
XzaR
fonte
0

Tive esse problema depois de adicionar uma referência a outro projeto que tinha as mesmas rotas e o problema continuou depois que removi a referência.

Resolvido excluindo o arquivo .dll dessa referência adicionada da pasta bin e reconstruindo.

Logan Miller
fonte
0

Como muitos outros, tive esse problema depois de criar um novo projeto de modelo MVC a partir do menu VS2017, ao construir o projeto eu recebia a mensagem de erro da operação. Em seguida, usei a resposta https://stackoverflow.com/a/15651619/2417292 postada anteriormente neste tópico por cooloverride para projetos mvc4. Isso ainda não corrigiu meu problema, então renomei minha pasta de visualização Home e o arquivo HomeController para a pasta de visualização Company / e o arquivo do controlador CompanyController. Isso funcionou para mim, não uma correção por dizer, mas uma solução alternativa se você não travou em ter a rota Home / Index, meu outro problema foi não consegui encontrar a referência que causou o erro e devido ao fato de minha plataforma dev ser Azure WebApplication versus um VM completa com um sistema de arquivos completo e configurações do IIS para mexer.

Eddie.Power_AU
fonte
0

Eu tive o mesmo problema e descobri que a versão mais antiga tinha criado arquivos compilados na pasta "bin".

Depois de excluí-los, o erro desapareceu.

Pavan Arunod
fonte