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?
fuente
Respuestas:
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.
fuente
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 :)
fuente
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
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:
fuente
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.
fuente
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 suyoControllerFactory
.fuente
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
fuente
En mi caso, el
namespaces
pará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" } ); }
fuente
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
fuente
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:
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.
fuente
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.
fuente
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)fuente
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í:
Revertir el orden solucionó el problema
fuente
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'.
fuente
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.
fuente
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)
fuente
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.
fuente
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ó.
fuente
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" />
fuente
Sobre la base de esta respuesta de George, encontré en mi caso que había configurado mi controlador correctamente
ThingController
y 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" />
fuente
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
fuente
Alguien agregó esto a una vista.
@Scripts.Render("~/bundles/jqueryval")
Luego agregaron el
BundleConfig.cs
archivo en laApp_Start
carpeta.En el
RegisterBundles
Método tenían:bundles.Add(new ScriptBundle("~/bundles/jquery").Include("~/Scripts/jquery-{version}.js"));
Sin embargo , se olvidaron de terminar de conectar esto en el
Global.asax.cs
Archivo.Para solucionarlo, todo lo que tenía que hacer era agregar esto al
Application_Start
método enGlobal.asax.cs
:Nota: Creo que el orden / ubicación de esta Línea en el
Application_Start
Método es importante,así que téngalo en cuenta.
Coloqué el mío inmediatamente después
ViewEngines
.fuente
O tal vez te perdiste la palabra clave "Controlador" al final del nombre del controlador;)
fuente
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.
fuente