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!


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.


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

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.



2

usa isto

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

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

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
    }

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;

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.


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.