web-dev-qa-db-fra.com

Comment enregistrer des zones pour le routage

J'ai créé l'application MVC qui a 3 zones différentes. (Admin, Utilisateur, News) Voici mon fichier RouteConfig.cs dans le répertoire App_Start:

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

Et voici mon fichier 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" }                
            );
        }
    }
}

Et enfin, voici le contenu de mon fichier Global.asax.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();
        }
    }
}

La page d'accueil de mon site Web est entièrement chargée et cela fonctionne. mais la page d'accueil de l'administrateur ou d'autres zones ne sont pas détectées par l'itinéraire et j'ai donné ce message d'erreur:

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

Comment puis-je résoudre ce problème? Merci.

29
Mojtaba

Appelez AreaRegistration.RegisterAllAreas() quelque part dans votre RegisterRoutes

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

Astuce: Utilisez un outil comme RouteDebugger 2. ou Routing Debugger pour enquêter sur vos itinéraires

Obtenez le dernier NuGet: Route Debugger for MVC or RouteDebugger for WepApi

Voici un tutoriel sur Comment configurer et utiliser RouteDebugger avec WebApi

29
Lukas Winzenried

D'après le code fourni, je peux voir 2 problèmes potentiels:

  1. Vous n'appelez pas RegisterAllAreas
  2. Vous ne semblez pas remplacer la propriété AreaName

Essayez de changer votre code pour:

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

Zone d'administration

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

Créez simplement un nom de classe statique il AreaConfig avec une méthode statique RegisterAreas () ici 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);
    }
}

puis appelez-le dans un fichier Global.asax.cs comme ceci:

protected void Application_Start()
    {
        . . .

        AreaConfig.RegisterAreas();

        . . .
    }
5
Dice