2012-11-19 19 views
26

Ho creato un'applicazione MVC con 3 aree diverse. (Admin, User, News) Questo è il mio RouteConfig.cs file nella directory App_Start:Come registrare le aree per il routing

public class RouteConfig 
{ 
    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[] { "TestMvcApplication.Controllers" } 
     ); 
    } 
} 

e questo è il mio file AdminAreaRegisteration.cs:

namespace TestMvcApplication.Areas.Admin 
{ 
    public class AdminAreaRegistration : AreaRegistration 
    { 
     public override string AreaName 
     { 
      get 
      { 
       return "Admin"; 
      } 
     } 

     public override void RegisterArea(AreaRegistrationContext context) 
     { 
      context.MapRoute(
       "Admin_default", 
       "Admin/{controller}/{action}/{id}", 
       new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
       namespaces: new[] { "TestMvcApplication.Areas.Admin.Controllers" }     
      ); 
     } 
    } 
} 

E infine questo è il mio Global.asax Contenuto del file .cs:

namespace TestMvcApplication 
{ 
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801 

    public class MvcApplication : System.Web.HttpApplication 
    { 
     protected void Application_Start() 
     { 
      AreaRegistration.RegisterAllAreas(); 

      WebApiConfig.Register(GlobalConfiguration.Configuration); 
      FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
      RouteConfig.RegisterRoutes(RouteTable.Routes); 
      BundleConfig.RegisterBundles(BundleTable.Bundles); 
      AuthConfig.RegisterAuth(); 
     } 
    } 
} 

Home page del mio sito Web a pieno carico ed è funzionante. ma Homepage d'amministrazione o di altri settori non sono rilevare per via e mi ha dato questo messaggio di errore:

Server Error in '/' Application. 
The resource cannot be found. 
Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable. Please review the following URL and make sure that it is spelled correctly. 

Requested URL: /Admin/Home 

Come posso risolvere questo problema? Grazie.

+1

Avete effettivamente un controller di casa nell'area di amministrazione? – James

+0

Sì, ho una classe HomeController.cs per ogni area. – Mojtaba

+0

Il tuo HomeController ha un metodo Index? Hai scavalcato la proprietà 'AreaName'? – James

risposta

26

chiamata AreaRegistration.RegisterAllAreas() qualche parte nella tua RegisterRoutes

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

Suggerimento: utilizzare uno strumento come RouteDebugger 2.0 o Routing Debugger di indagare i percorsi

Leggi ultima NuGet: Route Debugger for MVC o RouteDebugger for WepApi

Ecco un tutorial su How to set up and use RouteDebugger with WebApi

+1

Questo codice è nel mio file Global.asax.cs e Visual Studio ha creato questi metodi. – Mojtaba

+1

Che dire di Routing Debugger? Potresti pubblicare il risultato? –

+0

Ho usato il debugger di route ma non è stato possibile caricare la pagina e il problema persiste. route debugger mostra solo i percorsi solo nelle pagine caricate. – Mojtaba

18

Dal codice fornito posso vedere 2 potenziali problemi:

  1. Non sta chiamando RegisterAllAreas
  2. Lei non sembrano essere sovrascrivendo la proprietà AreaName

provare a cambiare la vostra codice a:

Global.asax

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
    AreaRegistration.RegisterAllAreas(); 
    routes.MapRoute(
     name: "Default", 
     url: "{controller}/{action}/{id}", 
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
     namespaces: new[] { "TestMvcApplication.Controllers" } 
    ); 
} 

zona Admin

public class AdminAreaRegistration : AreaRegistration 
{ 
    public override string AreaName 
    { 
     get 
     { 
      return "Admin"; 
     } 
    } 

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

Basta creare un nome di classe statica è AreaConfig con un metodo statico RegisterAreas() qui Codice:

public static class AreaConfig 
{ 
    public static void RegisterAreas() 
    { 
     // 
     // Admin area . . . 

     var adminArea = new AdminAreaRegistration(); 
     var adminAreaContext = new AreaRegistrationContext(adminArea.AreaName, RouteTable.Routes); 
     adminArea.RegisterArea(adminAreaContext); 


     // 
     // Default area . . . 

     var defaultArea = new DefaultAreaRegistration(); 
     var defaultAreaContext = new AreaRegistrationContext(defaultArea.AreaName, RouteTable.Routes); 
     defaultArea.RegisterArea(defaultAreaContext); 
    } 
} 

quindi chiamare in un file Global.asax.cs come questo:

protected void Application_Start() 
    { 
     . . . 

     AreaConfig.RegisterAreas(); 

     . . . 
    } 
Problemi correlati