No se encontró el controlador para la ruta o no implementa IController

79

Tengo un proyecto MVC4 con selección de idioma:

  • en
  • nl
  • fr
  • Delaware

1 parte principal con:

  • Acerca de
  • Común (para el menú)
  • Contacto
  • Preguntas más frecuentes
  • Casa

Y 3 áreas:

  • Administración
  • Clientes
  • tienda

En cada área tengo al menos un controlador, por ejemplo, en Admin tengo la descripción general del controlador con la vista general de la carpeta de vista correspondiente que contiene una página index.aspx .

La página de inicio y todas las páginas principales (acerca de, faq, etc.) funcionan y se pueden visitar).

Sin embargo, cuando sigo la URL: localhost: xxxx / en / admin / overview, aparece el error:

El controlador para la ruta '/ en / admin / overview' no se encontró o no implementa IController.

Aunque la ruta es correcta (puedo ver esto con Route Debugger), la página de error también muestra que el error se produjo cuando quería cargar los elementos del menú principal:

<nav id="site-navigation" class="eightcol">
    @Html.Action("MenuItems", "Common")
</nav>

- Código eliminado porque es irrelevante -

Todo parece estar en orden, pero MVC no parece poder cargar el menú, que se encuentra en la parte principal.

Entonces, la raíz del problema es: ¿Puedo otorgar acceso a un área (por ejemplo, administrador) a los controladores en la parte principal (hogar, común, acerca de, etc.) de mi proyecto?

reaper_unique
fuente
¿Ha intentado comentar la llamada a Html.Action para aislar el problema al controlador específico?
Jonas Høgh
Todavía no lo había hecho, pero ahora lo hice y es como pensaba. El administrador de área usa el diseño de la parte principal de mi proyecto y cuando llega a la acción, el área intenta acceder al controlador que no se encuentra en el área que arroja el error. En otras palabras, la raíz del problema es, ¿cómo puedo otorgar acceso a un área a los controladores en la parte principal (controladores domésticos, comunes, sobre, etc.) de mi proyecto?
reaper_unique
2
La cuestión es conseguir más problemas y soluciones posibles. Por lo tanto, creo que es imprescindible mirar otras respuestas también y no la única aceptada.
Alireza

Respuestas:

122

Lo encontré.

Cuando una página, que se encuentra dentro de un área, quiere acceder a un controlador que se encuentra fuera de esta área (como una página de diseño compartido o una determinada página dentro de un área diferente), es necesario agregar el área de este controlador. Dado que el controlador común no está en un área específica, sino que es parte del proyecto principal, debe dejar el área vacía:

@Html.Action("MenuItems", "Common", new {area="" }) 

Lo anterior debe agregarse a todas las acciones y enlaces de acción, ya que la página de diseño se comparte en las diversas áreas.

Es exactamente el mismo problema que aquí: ASP.NET MVC Areas con diseño compartido

Editar : Para ser claros, esto está marcado como la respuesta porque era la respuesta a mi problema. Las respuestas anteriores podrían resolver las causas que desencadenan el mismo error.

reaper_unique
fuente
11
Gracias, eso funcionó para mí. Es un mensaje de error muy engañoso de .NET que dice que no se puede encontrar el controlador de la acción dentro del área, ¡lo cual no es el caso en absoluto!
Richard Fawcett
1
Esto solucionó mi problema. Supongo que la próxima vez debería comenzar con la respuesta de verificación verde en lugar de en la parte superior de la lista.
Cameron Belt
'@ Html.Action ("Acerca de", "Inicio", nuevo {area = ""})' arroja un error de compilación al especificarlo como un área en blanco. Alguna sugerencia ?
Thamarai T
16

En mi caso, el mismo error no estaba relacionado con Area pero pensé en publicar el error causado en mi caso, lo cual puede ser útil para las personas que llegan a este hilo buscando "No se encontró el controlador para la ruta o no implementa IController "

El error se debió a una entrada incorrecta en el archivo _Layout.cshtml.

@Styles.Render("~/Content/misc")

El paquete con ese nombre se eliminó en BundleConfig.cs pero se olvidó de eliminarlo en _Layout.cshtml

Fue una tontería, pero los programadores siempre cometemos muchos errores tontos :)

Tejasvi Hegde
fuente
1
Gracias por la solucion De hecho, es posible que haya múltiples soluciones para un problema aparentemente idéntico pero en realidad solo similar. Sin embargo, como mi pregunta decía que utilizo áreas, mi propia solución seleccionada sigue siendo la más precisa.
reaper_unique
15

Además, para aquellos a quienes la solución anterior no funcionó, esto es lo que funcionó para mí:

Tengo una solución con múltiples proyectos. Todos los proyectos estaban en MVC3. Instalé Visual Studio 2012 en mi máquina y parece que algunos proyectos se actualizaron automáticamente a MVC4.

Tengo este problema

El controlador para la ruta '/ etc / etc' no se encontró o no implementa IController

porque el proyecto que manejó esa ruta apuntaba a MVC4.

Tuve que actualizar manualmente sus referencias para usar MVC3. También puede hacerlo abriendo el archivo .csproj con un editor de texto. Busque la referencia a MVC3 y elimine esta línea:

<SpecificVersion>False</SpecificVersion>
Carlos Martinez T
fuente
2
Oh Dios mío. Eso es tan aleatorio y oscuro. Muchas gracias por postear! :) FUTUROS LECTORES: La mía sólo era ligeramente diferente - la versión dll en sí era 4.0 en lugar de 3.0 - no estoy seguro de cómo se cambió.
Jared
El problema con el mío fue similar; Tenía una biblioteca compartida a la que hacía referencia la capa de presentación y que contenía un controlador compartido, y la biblioteca compartida usaba mvc4, mientras que la capa de presentación usaba mvc3. Una vez que actualicé la biblioteca compartida a MVC3, resolvió el problema.
jbooker
13

Otra posible causa raíz de este error es si el espacio de nombres de la clase de registro de área no coincide con el espacio de nombres del controlador.

Por ejemplo, nomenclatura correcta en la clase de controlador:

namespace MySystem.Areas.Customers
{
    public class CustomersController : Controller
    {
        ...
    }
}

Con nombres incorrectos en la clase de registro de área:

namespace MySystem.Areas.Shop
{
    public class CustomersAreaRegistration : AreaRegistration
    {
        ...
    }
}

(El espacio de nombres de arriba debería ser MySystem.Areas.Customers.)

¿Aprenderé alguna vez a dejar de copiar y pegar código? Probablemente no.

Carl Sharman
fuente
2
Esto me sorprendió y fue difícil de encontrar porque el espacio de nombres era incorrecto cuando estaba en la carpeta del controlador raíz (código copiado de otro proyecto), pero no importaba antes de moverlo a un área.
Richard Garside
12

Este error también puede ser causado por el hecho de que los controladores deben tener (en su nombre) la palabra Controller; a saber: HomeController; a menos que implemente el suyo ControllerFactory.

George Stocker
fuente
2
Este fue mi error. ¡Gracias George!
Wilky
Tuve este problema. Fue porque eliminé mi archivo HomeController.cs y no entendí qué dependía de él.
user2023861
Usted es el CEO
Denys Wessels
12

en mi caso, el problema fue que la clase de controlador no se ha anunciado públicamente.

class WorkPlaceController : Controller

la solución fue

public class WorkPlaceController : Controller
SoaperPlus
fuente
7

En mi caso, el namespacesparámetro no coincidía con el espacio de nombres del controlador.

public override void RegisterArea(AreaRegistrationContext context) 
{
    context.MapRoute(
        "Admin_default",
        "Admin/{controller}/{action}/{id}",
        new {controller = "Home", action = "Index", id = UrlParameter.Optional },
        namespaces: new[] { "Web.Areas.Admin.Controllers" }
    );
}
Alexander Puchkov
fuente
6

Aquí está mi problema y la solución que funcionó para mí.

Agregué un nuevo controlador con una sola acción que devuelve una cadena a una aplicación existente. Pero cuando navegué a ese controlador a través del navegador, recibí el mismo error que se mencionó anteriormente.

Después de buscar mucho en Google, descubrí que simplemente tenía que modificar mi archivo Global.asax.cs para que reconociera el nuevo controlador. Todo lo que hice fue agregar un espacio al archivo Global.asax.cs para que se modifique y funcione

armulator
fuente
Contamos con 3 servidores web de producción y 5 máquinas de desarrollo / prueba. Solo en una máquina de producción no funcionaba. Agregar un espacio y guardar Global.asax lo solucionó. #mindblown
jbwebtech
5

No estoy seguro de si esto llega a la solución desde un ángulo diferente a la respuesta aceptada, pero encontré que uno de mis controladores en la sección Áreas estaba sentado en el espacio de nombres incorrecto. Corrigiendo el espacio de nombres a:

Areas.{AreaName}.Controller

solucionó el problema para mí.

Sospecho que el factor clave fue que todos los controladores dentro de un área determinada compartieran el mismo espacio de nombres.

Richard Freeman
fuente
Ojalá pudieras tener respuestas favoritas y no solo preguntas. Me he encontrado con esta respuesta tantas veces. Ha sido muy útil, gracias.
Shelby115
5

Otra causa de este error: uso accidental de Html.Action en un archivo de diseño en el que Html.ActionLink puede haber sido diseñado. Si la vista a la que hace referencia Html.Action usa el mismo archivo de diseño, efectivamente ha creado un bucle sin fin. (La vista de diseño carga la vista a la que se hace referencia como vista parcial que luego carga la vista de diseño que carga la vista a la que se hace referencia ...) Si establece un punto de interrupción en el archivo de Diseño y un solo paso a través de Htlm.Action, a veces obtendrá una acción más útil mensaje sobre un tamaño de pila excesivo.

Mike Smith - MCT - Jugador Más Valioso
fuente
5

En mi caso, lo tenía @{ Html.RenderAction("HeaderMenu", "Layout", new { Area = string.Empty }); }en _Layout.cshtml pero el LayoutController no existía. (Había copiado _Layout.cshtml de otra solución pero olvidé copiar el controlador)

Rush Frisby
fuente
4

En mi caso, en el método global.asax / application_start, estaba registrando las rutas de la API web DESPUÉS de las rutas mvc así:

RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register);

Revertir el orden solucionó el problema

GlobalConfiguration.Configure(WebApiConfig.Register);            
RouteConfig.RegisterRoutes(RouteTable.Routes);
Ege Tuncoz
fuente
2

Si es apropiado para su diseño, puede asegurarse de que el modificador de acceso en su clase de controlador sea 'público', no algo que pueda limitar el acceso como 'interno' o 'privado'.

Chris Halcrow
fuente
2

Vergonzosamente, el problema en mi caso es que no he reconstruido el código después de agregar el controlador .

Entonces, tal vez lo primero que debe verificar es que su controlador fue construido y está presente (y público) en los binarios. Podría ahorrarle unos minutos de depuración si es como yo.

Tom Pažourek
fuente
1
Por supuesto que ese era mi problema ... Siempre son las cosas estúpidas las que te atrapan.
TJ Wolschon
2

Esto podría deberse a que el camino estaba equivocado. Así que primero verifique la ruta y la ortografía del controlador. En mi caso, mi controlador se llamaba CampsController y el archivo WebApiConfig.cs tenía una ruta adicional.

En lugar de: http: // localhost: 6600 / Camps

Fue: http: // localhost: 6600 / api / Camps

No había notado la palabra api en el archivo WebApiConfig.cs:

config.Routes.MapHttpRoute(
          name: "DefaultApi",
          routeTemplate: "api/{controller}/{id}",
          defaults: new { id = RouteParameter.Optional }
      );

También podría deberse a que el controlador se nombró incorrectamente. Aquí llamé LayoutController, pero debería haber llamado Layout en su lugar:

<a class="nav-link" href="#">@Html.Action("GetCurrentUser", "LayoutController" })</a>

debiera ser:

<a class="nav-link" href="#">@Html.Action("GetCurrentUser", "Layout")</a>

Otro ejemplo, podría deberse a que tiene definidas rutas de ruta incorrectas. Asegúrese de que sus caminos sean correctos. Ejemplo:

   [RoutePrefix("api/camps")]
   public class CampsController : ApiController

   [Route("{moniker}")]
   public async Task<IHttpActionResult> Get(string moniker)
vive el amor
fuente
1

En otro escenario que solo me gustaría agregar es En mi escenario, el espacio de nombres era diferente para el controlador, ya que fue un error al copiar el controlador de otro proyecto.

La vida de Pi
fuente
1

En mi caso de una aplicación heredada, el problema ocurrió cuando agregué la siguiente entrada en el archivo web.config debajo del nodo <system.webServer>

       <modules runAllManagedModulesForAllRequests="true"></modules>

Cuando lo eliminé, el problema se resolvió.

Prashant Deherkar
fuente
1

Este problema también ocurre si no incluye su clase de controlador para el proceso de compilación en los archivos .csproj.

<Compile Include="YOUR_CONTROLLER_PATH.cs" />
Ismail Yilmaz
fuente
1

Sobre la base de esta respuesta de George, encontré en mi caso que había configurado mi controlador correctamente ThingControllery tenía un método definido correctamente en ese controladorEdit .

Pero ... lo estaba haciendo referencia en mi opinión con

<a href="https://stackoverflow.com/App/ThingController/Edit" />

Donde debería haber estado usando el nombre sin la palabra controlador como

<a href="https://stackoverflow.com/App/Thing/Edit" />

MysticVagabond
fuente
1

En mi caso, estaba renderizando otro método de acción para mi sección de menú en el archivo _layout.cshtml usando @ Html.Action ("Menú", "Menú") mientras que olvidé crear el controlador de menú y como archivo de diseño se estaba utilizando en mi actual La vista de la acción del controlador, por lo tanto, recibía este error en mi solicitud de procesamiento de acción actual. intente buscar en su diseño y ver el archivo si cometió el mismo error

Neeraj Singh
fuente
0

Alguien agregó esto a una vista.

@Scripts.Render("~/bundles/jqueryval")

Luego agregaron el BundleConfig.csarchivo en la App_Startcarpeta.
En el RegisterBundlesMétodo tenían:

bundles.Add(new ScriptBundle("~/bundles/jquery").Include("~/Scripts/jquery-{version}.js"));

Sin embargo , se olvidaron de terminar de conectar esto en elGlobal.asax.csArchivo.
Para solucionarlo, todo lo que tenía que hacer era agregar esto alApplication_Startmétodo enGlobal.asax.cs:

RouteConfig.RegisterRoutes(RouteTable.Routes);

Nota: Creo que el orden / ubicación de esta Línea en el Application_StartMétodo es importante,
así que téngalo en cuenta.
Coloqué el mío inmediatamente después ViewEngines.

MikeTeeVee
fuente
0

O tal vez te perdiste la palabra clave "Controlador" al final del nombre del controlador;)

Hoàng Nghĩa
fuente
0

Espero que esto ayude a alguien más. Tuve este problema porque, aunque tenía el controlador con el nombre correcto, la clase dentro del archivo tenía un error tipográfico. Estaba buscando OrderSearch y el archivo era OrderSearchController.cs, pero la clase era OrdersSearchController.

Obviamente, deberían coincidir, pero no es necesario, y su ruta apunta a la clase, no al nombre del archivo.

John Lord
fuente