2013-03-25 18 views
13

Area cartelle assomigliano:Instradamento area in PVC?

Areas 
    Admin 
     Controllers 
      UserController 
      BranchController 
      AdminHomeController 

directory di progetto assomigliano:

Controller 
    UserController 
     GetAllUsers 

registrazione percorso zona

public override void RegisterArea(AreaRegistrationContext context) 
{ 
    context.MapRoute(
     "Admin_default", 
     "Admin/{controller}/{action}/{id}", 
     new { action = "Index", id = UrlParameter.Optional }, 
     new { controller = "Branch|AdminHome|User" } 
    ); 
} 

registrazione percorso progetto

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

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

Quando instrado in questo modo: http://mydomain.com/User/GetAllUsers Ottengo l'errore di ricerca non trovata (404). Ottengo questo errore dopo aver aggiunto UserController all'Area.

Come posso risolvere questo errore?

Grazie ...

risposta

26

Hai incasinato i tuoi spazi dei nomi del controller.

tua definizione percorso principale dovrebbe essere:

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

e l'area di amministrazione di registrazione percorso dovrebbe essere:

public override void RegisterArea(AreaRegistrationContext context) 
{ 
    context.MapRoute(
     "Admin_default", 
     "Admin/{controller}/{action}/{id}", 
     new { action = "Index", id = UrlParameter.Optional }, 
     new { controller = "Branch|AdminHome|User" }, 
     new[] { "MyApp.Areas.Admin.Controllers" } 
    ); 
} 

Notate come devono essere utilizzati gli spazi dei nomi corretti.

+0

Sono stato confuso dagli spazi dei nomi che corrispondono alle aree. In questo esempio lo spazio dei nomi MyApp.Areas.Admin.Controllers corrisponde alla gerarchia delle cartelle, tuttavia la definizione dello spazio dei nomi è arbitraria, giusto? Significa che il programmatore potrebbe assegnare qualsiasi spazio dei nomi alla classe controller che volevano - ho pensato. O c'è qualche convenzione asp.net per mvc che richiede che lo spazio dei nomi corrisponda alla gerarchia delle cartelle? – Howiecamp

+1

@Howiecamp il comportamento predefinito di Visual Studio è quello di abbinare lo spazio dei nomi alla gerarchia delle cartelle e questo è ciò che si vedrà in genere in tutti i progetti .net (non solo i progetti MVC). –