vista tutorial net mvc modelo formulario form controlador asp asp.net-mvc asp.net-mvc-3 asp.net-mvc-areas

asp.net mvc - tutorial - Tener problemas con mĂșltiples controladores del mismo nombre en mi proyecto



formulario asp.net mvc 5 (8)

Como Chris Moschini menciona el parámetro 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á 500 errores 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"} );

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

RequestContext.RouteData.DataTokens["UseNamespaceFallback"] = false;

Me estoy encontrando 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 brinda servicios a 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 ''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 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 Company, con un HomeController en la carpeta del controlador predeterminado para el área, con un nombre de clase 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 } ); }

Esto es todo lo que lleva el error que destaqué al comienzo de esta publicación. Estoy luchando para intentar armar una solución de varios otros puestos, SIN NUCLEAR .

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

¡Cualquier ayuda sería muy apreciada!


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 ''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á que http://server/ vaya a la acción Index de su HomeController, que es, creo, lo que quiere. http://server/company/home irá a la acción del índice HomeController del área de la compañía, como se define en el registro de área.


Este es el enfoque de asp.net mvc4:

routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "RegisterNow", id = UrlParameter.Optional }, namespaces: new[] { "YourCompany.Controllers" } );


Había cambiado el nombre de los espacios de nombres, por lo tanto, solo eliminé las carpetas bin y obj y reconstruí , volví a trabajar.


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

Tengo que resolver la adición de 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 }


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


utilizar esta

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