2012-11-19 8 views
26

Ich erstellte MVC-Anwendung, die 3 verschiedene Bereich haben. (Admin, Benutzer, News) Das ist meine RouteConfig.cs Datei in App_Start Verzeichnis:So registrieren Sie Bereiche für das 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" } 
     ); 
    } 
} 

Und das ist meine AdminAreaRegisteration.cs Datei:

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" }     
      ); 
     } 
    } 
} 

Und schließlich das ist mein Global.asax .cs Datei Inhalt:

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(); 
     } 
    } 
} 

Homepage meiner Website voll geladen und es funktioniert. aber Homepage von Admin oder anderen Bereichen werden nicht von Route erkannt und ich gab diese Fehlermeldung:

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 

Wie kann ich dieses Problem lösen? Danke.

+1

Haben Sie tatsächlich einen Heim-Controller in Ihrem Admin-Bereich? – James

+0

Ja, ich habe eine HomeController.cs-Klasse für jeden Bereich. – Mojtaba

+0

Hat Ihr HomeController eine Indexmethode? Haben Sie die Eigenschaft 'AreaName' überschrieben? – James

Antwort

26

Anruf AreaRegistration.RegisterAllAreas() irgendwo in Ihrem RegisterRoutes

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

Tipp: ein Tool wie RouteDebugger 2.0 oder Routing Debugger Verwenden Sie Ihre Routen

zu untersuchen

neuesten NuGet Get: Route Debugger for MVC oder RouteDebugger for WepApi

hier ein Tutorial auf How to set up and use RouteDebugger with WebApi

+1

Dieser Code befindet sich in meiner Global.asax.cs-Datei und Visual Studio erstellte diese Methoden. – Mojtaba

+1

Was ist mit Routing-Debugger? Könnten Sie das Ergebnis veröffentlichen? –

+0

Ich habe Route Debugger verwendet, aber die Seite konnte nicht geladen werden und das Problem bleibt bestehen. Routen-Debugger zeigt nur die Routen in geladenen Seiten an. – Mojtaba

18

Aus dem Code bereitgestellt I 2 mögliche Probleme sehen:

  1. Sie rufen nicht RegisterAllAreas
  2. Sie erscheinen nicht die AreaName Eigenschaft überschrieben werden

Ändern Versuchen Sie, Ihre Code zu:

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" } 
    ); 
} 

Admin-Bereich

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

Erstellen Sie einfach einen statischen Klassennamen es AreaConfig mit einer statischen Methode RegisterAreas() hier Code:

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); 
    } 
} 

nennt es dann in eine Datei Global.asax.cs wie folgt:

protected void Application_Start() 
    { 
     . . . 

     AreaConfig.RegisterAreas(); 

     . . . 
    } 
Verwandte Themen