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" }
);
Otra causa plausible de este problema se puede encontrar a continuación:
Se encontraron varios tipos que coinciden con el controlador llamado ''Inicio''