tutorial teachtutorial net mvc asp c# asp.net-mvc-4 asp.net-mvc-areas

c# - net - teachtutorial asp mvc



El controlador para la ruta no se encontrĂ³ o no implementa IController (15)

Además, para 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 manejaba 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. Encuentre la referencia a MVC3 y elimine esta línea:

<SpecificVersion>False</SpecificVersion>

Tengo un proyecto MVC4 con selección de idioma:

  • es
  • 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 (sobre, preguntas frecuentes, etc.) funcionan y se pueden visitar).

Sin embargo, cuando sigo la url: localhost: xxxx / en / admin / overview obtengo el error

El controlador para la ruta ''/ es / 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 mis 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 (p. Ej., Administrador) a los controladores en la parte principal (casa, común, sobre, etc.) de mi proyecto?


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

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

Después de hacer muchas búsquedas 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 funcionó


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

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


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

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

Cuando lo eliminé, el problema se resolvió.


En mi caso, el mismo error no estaba relacionado con Area pero pensé en publicar el error causado en mi caso, que puede ser útil para las personas que buscan este hilo al buscar "El controlador de ruta no se encontró o no implementa IController "

El error fue causado por 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 :)


En mi caso, el parámetro namespaces 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" } ); }


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


En otro caso, simplemente me gustaría agregar que, en mi caso, el espacio de nombre era diferente para el controlador, ya que era un error al copiar el controlador de otro proyecto.


Este error también puede deberse al hecho de que los Controladores deben tener (en su nombre) la palabra Controller ; a saber: HomeController ; a menos que implemente su propio ControllerFactory .


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 página determinada dentro de un área diferente), el área de este controlador debe agregarse. Como el controlador común no se encuentra en un área específica sino que forma 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 Áreas con diseño compartido

Editar : Para que quede claro, esto está marcado como la respuesta porque fue la respuesta a mi problema. Las respuestas anteriores pueden resolver las causas que desencadenan el mismo error.


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

Areas.{AreaName}.Controller

arregló el problema para mí

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


Otra causa de este error es el uso accidental de Html.Action en un archivo de diseño donde Html.ActionLink puede haber sido diseñado. Si la vista referenciada por Html.Action usa el mismo archivo Layout, efectivamente ha creado un bucle infinito. (La vista de diseño carga la vista referenciada como vista parcial que luego carga la vista de diseño que carga la vista referenciada ...) Si configura un punto de interrupción en el archivo de diseño y un solo paso a través de Htlm.Acción, a veces obtendrá una ayuda más útil mensaje sobre el tamaño excesivo de la pila.


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

Por ejemplo, nombrar correctamente 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 anterior debe ser MySystem.Areas.Customers ).

¿Alguna vez aprenderé a dejar de copiar y pegar el código? Probablemente no.


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''.


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

class WorkPlaceController : Controller

la solución fue

public class WorkPlaceController : Controller