Tener problemas con varios controladores del mismo nombre en mi proyecto

96

Me encuentro con el siguiente error con mi proyecto ASP.NET MVC 3:

Se encontraron varios tipos que coinciden con el controlador llamado 'Inicio'. Esto puede suceder si la ruta que atiende esta solicitud ('Inicio / {acción} / {id}') no especifica espacios de nombres para buscar un controlador que coincida con la solicitud. Si este es el caso, registre esta ruta llamando a una sobrecarga del método 'MapRoute' que toma un parámetro de 'espacios de nombres'.

La solicitud de 'Inicio' ha encontrado los siguientes controladores coincidentes: MyCompany.MyProject.WebMvc.Controllers.HomeController MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController

Tengo un HomeController en mi carpeta de controlador predeterminada, con un nombre de clase de MyCompany.MyProject.WebMvc.Controllers.HomeController.

Mi método RegisterRoutes, en mi global.asax, se ve así:

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

Luego tengo un área llamada Compañía, con un HomeController en la carpeta del controlador predeterminado para el área, con un nombre de clase de MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController.

El método RegisterArea en el archivo CompanyAreaRegistration se ve así:

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

Todo esto está provocando el error que destaqué al principio de esta publicación. Estoy luchando tratando de armar una solución de varias otras publicaciones, sin SUERTE .

¿Es posible tener un HomeController en la carpeta de controladores predeterminada y luego uno en CADA área? Si es así, ¿necesito hacer (asumiendo que lo hago) cambios en mi archivo de configuración para que esto funcione?

¡Cualquier ayuda será muy apreciada!

mattruma
fuente
Consulte este stackoverflow.com/a/12633541/2089963 . Esto funciona para mi
Syed Mohamed
Esto me sucedió cuando cambié el nombre del proyecto / ensamblaje, simplemente eliminé la carpeta bin y volví a compilar el proyecto y funcionó bien.
Core

Respuestas:

167

El mensaje de error contiene la solución recomendada: "Si este es el caso, registre esta ruta llamando a una sobrecarga del método 'MapRoute' que toma un parámetro de 'espacios de nombres'".

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

Esto hará http: // server / vaya a la acción Index de su HomeController, que es, creo, lo que desea. http: // server / company / home irá a la acción del índice de HomeController del área de la empresa, como se define en el registro del área.

David Ruttka
fuente
1
No lo he probado, pero el namespacesparámetro es una matriz de cadenas, por lo que debería poder pasar cualquier número agregando a la matriz:new string[] { "MyCompany.MyProject.WebMvc.Controllers", "My.Second.Namespace", "My.Third.Namespace", "Namespaces.Etc" }
David Ruttka
2
Ese patrón de espacio de nombres no funcionó para mí. MyProject.Controllershizo sin embargo.
The Muffin Man
Probé este. Pero el índice de esta MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeControllerclase se está ejecutando. Pero la Vista que aparece es la antigua.
kbvishnu
No vale la pena que el cuarto parámetro aquí pueda ser un poco confuso debido a la inferencia de tipos y el significado de las variables. El cuarto parámetro puede ser una matriz de cadenas para restringir por espacio de nombres, un objeto para agregar IRouteConstraints O cadenas que se pueden interpretar como restricciones, o puede tener 5 parámetros e incluir ambos. aspnetwebstack.codeplex.com/SourceControl/changeset/view/…
Chris Moschini
También vale la pena señalar que una ruta encontrará su camino a otros espacios de nombres de forma predeterminada; si desea bloquear una ruta a un espacio de nombres o un conjunto de espacios de nombres, debe deshabilitar este respaldo : bubblogging.wordpress.com/2012/06/09/mvc- routing-namespaces (parte inferior de la página)
Chris Moschini
30

Este es el enfoque 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
fuente
2
gracias, esto me resolvió, aunque no puedo entender por qué mi aplicación cree que hay dos controladores domésticos en primer lugar. Hice una búsqueda y reemplazo del espacio de nombres, lo que parece haber causado el problema, pero una búsqueda de la solución completa no muestra ninguna instancia del espacio de nombres no autorizado.
Yann Duran
12
Bueno, encontré la causa de mi problema. Con suerte, esto puede ayudar a alguien más a buscar desesperadamente, como lo estaba yo hoy. Debido a que había cambiado el nombre de la aplicación (así como el espacio de nombres), todavía quedaba una DLL en la carpeta bin que no se eliminó mediante una limpieza. Debe haber algo de magia MEF bajo las sábanas. Tan pronto como descubrí y eliminé el archivo DLL anterior, el problema desapareció. ¡No es de extrañar que una búsqueda de texto no lo haya encontrado!
Yann Duran
@YannDuran, se encontró con un problema similar y su solución ayudó. Gracias.
Klaus Nji
12

Había cambiado el nombre de los espacios de nombres, así que solo elimino las carpetas bin y obj y las reconstruyo , trabajo de nuevo.

Reynaldo
fuente
2

utilizar este

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

Use solo el nombre del proyecto:

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
red luminosa
fuente
1

Si está utilizando RazorGenerator, solo informa al namespaces parámetro podría no ser suficiente.

Tengo que resolver agregando la declaración marcada a continuación en 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
fuente
0

Como Chris Moschini menciona, el parámetro de espacios de nombres puede no ser suficiente si tiene dos áreas con el mismo nombre de controlador con diferentes espacios de nombres y la ruta predeterminada de ninguna área devolverá un error de servidor 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"}
);

Es "mejor" anular el controlador de ruta predeterminado y agregar esta línea:

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

Tuve este problema después de agregar una referencia a otro proyecto que tenía las mismas rutas y el problema continuó después de eliminar la referencia.

Se resuelve eliminando el archivo .dll de esa referencia agregada de la carpeta bin y reconstruyendo.

Logan Miller
fuente
0

Como muchos otros, tuve este problema después de crear un nuevo proyecto de plantilla MVC desde el menú VS2017, al construir el proyecto recibía el mensaje de error de la operación. Luego utilicé la respuesta https://stackoverflow.com/a/15651619/2417292 publicada anteriormente en este hilo por cooloverride para proyectos mvc4. Esto todavía no solucionó mi problema, así que cambié el nombre de mi carpeta de vista de Inicio y el archivo de HomeController para que sea la carpeta de vista Company / y el archivo de controlador CompanyController. Esto funcionó para mí, no una solución por decir, sino una solución alternativa si no está atascado en tener la ruta Inicio / Índice, mi otro problema fue que no pude encontrar la referencia que causa el error y debido a que mi plataforma de desarrollo es Azure WebApplication vs a VM completa con un sistema de archivos completo y configuraciones de IIS para jugar.

Eddie.Power_AU
fuente
0

Tuve el mismo problema y descubrí que la versión anterior había creado archivos compilados en la carpeta "bin".

Una vez que los eliminé, el error desapareció.

Pavan Arunod
fuente