2012-02-04 44 views
5

En una aplicación ASP.NET MVC 3 con áreas (consulte el esquema a continuación). El directorio "Controladores" de la raíz ha sido eliminado.Mismo nombre de controlador en diferentes áreas

Cuando hago esto:

routes.MapRoute(
     "Default", // Route name 
     "{controller}/{action}/{id}", // URL with parameters 
     new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
    ); 

consigo este error: No se encontraron tipos múltiples que coinciden con el controlador llamado 'Home'. Esto puede suceder si la ruta que brinda servicios a esta solicitud ('{controller}/{action}/{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 el parámetro 'espacios de nombres'. La solicitud de 'Home' ha encontrado que coinciden con los controladores siguientes: MyProject.Areas.Administration.Controllers.HomeController MyProject.Areas.BackEnd.Controllers.HomeController MyProject.Areas.FrontEnd.Controllers.HomeController

Cuando hago esto:

routes.MapRoute(
     "Default", // Route name 
     "{controller}/{action}/{id}", // URL with parameters 
     new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults 
     new string[] { "MyProject.Areas.Administration.Controllers" } 
    ); 

consigo tis de error:

The view 'Index' or its master was not found or no view engine supports the searched locations. The following locations were searched: 
~/Views/Home/Index.aspx 
~/Views/Home/Index.ascx 
~/Views/Shared/Index.aspx 
~/Views/Shared/Index.ascx 
~/Views/Home/Index.cshtml 
~/Views/Home/Index.vbhtml 
~/Views/Shared/Index.cshtml 
~/Views/Shared/Index.vbhtml 


---- Areas 
     | 
     |---- Administration 
     |  |--- Controllers 
     |  |  |---- HomeController 
     |  |--- Views 
     |    |--- Index 
     |---- FrontEnd 
     |  |--- Controllers 
     |  |  |---- HomeController 
     |  |--- Views 
     |    |--- Index 
     |---- BackEnd 
       |--- Controllers 
       |  |---- HomeController 
       |--- Views 
         |--- Index 

Update1 Para iniciar a un controlador específico en las áreas, he intentado esto:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

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

Respuesta

11

intente lo siguiente:

~/Global.asax.cs:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

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

~/Areas/Administration/AdministrationAreaRegistration.cs

public override void RegisterArea(AreaRegistrationContext context) 
{ 
    context.MapRoute(
     "Administration_default", 
     "Administration/{controller}/{action}/{id}", 
     new { action = "Index", id = UrlParameter.Optional }, 
     new[] { "MyProject.Areas.Administration.Controllers" } 
    ); 
} 

~/Areas/FrontEnd/FrontEndAreaRegistration.cs:

public override void RegisterArea(AreaRegistrationContext context) 
{ 
    context.MapRoute(
     "FrontEnd_default", 
     "FrontEnd/{controller}/{action}/{id}", 
     new { action = "Index", id = UrlParameter.Optional }, 
     new[] { "MyProject.Areas.FrontEnd.Controllers" } 
    ); 
} 

Ahora cuando solicita /Administration/Home/Index, la acción de IndexHomeController en la zona Administration será invocado y va a buscar la vista ~/Areas/Administration/Views/Home/Index.cshtml. Asegúrate de que esta vista esté presente en esta ubicación. En su imagen parece haber omitido el directorio Home - ~/Areas/Administration/Views/Index.cshtml.

+0

Se ve bien. Uno más piensa. Cuando presiono F5 en VS, me gustaría ir al área de Backend en Home/Index –

+0

@ Kris-I, en este caso, modifique el registro de ruta de su área o vaya a las propiedades de su proyecto y en la pestaña Web que podría establecer una página de inicio en la que podría definir 'Administración/Inicio/Índice'. De esta forma, cuando ejecute la aplicación, navegará automáticamente a este controlador. –

+0

Cambiar la página de inicio está bien, pero por registro de ruta eche un vistazo a update1. Gracias –

Cuestiones relacionadas