12
votes

MVC 2 ARREAREGIVRATION

J'ai remarqué que dans la prévisualisation 2 de MVC 2, AreAregistration charge les itinéraires de chaque zone dans un ordre arbitraire. Y a-t-il un bon moyen d'en avoir un avant l'autre?

Par exemple, j'ai deux domaines - "Site" et "Admin". Les deux ont un contrôleur "blog". P>

Je voudrais ce qui suit: p>

/admin/ --> go to Admin's Blog controller
/       --> go to Site's Blog controller. 


0 commentaires

4 Réponses :


7
votes

Il n'est pas possible de commander des zones. Cependant, je pense qu'il est logique d'essayer de faire de chaque région comme étant indépendante des autres zones que possible, de sorte que l'ordre n'a pas d'importance.

Par exemple, au lieu d'avoir la route {contrôleur} / {action} / {id} / {id} itinéraire, peut-être remplacer cela avec des itinéraires spécifiques pour chaque contrôleur. Ou ajoutez une contrainte à cet itinéraire par défaut.

Nous moulons sur les options pour permettre la commande, mais nous ne voulons pas surcharger la fonctionnalité.


4 commentaires

Hey Phil, merci pour l'explication. J'ai fini par déplacer mon "site" dans des zones et c'est maintenant la section "par défaut / non-zone" (avec des vues et des contrôleurs en root). J'ai ensuite défini mon paramètre d'espace de noms sur les contrôleurs par défaut pour éviter l'erreur "Contrôleur ambiguë". En outre, j'aurais pu créer probablement des contraintes à quelque chose comme ^ ((?! admin). *) Pour ignorer l'administrateur dans les itinéraires de la zone du site. Je suis d'accord, l'ajout de plus de complexité n'est pas géniale, même s'il semble que les itinéraires MVC 1 (non région) puissent potentiellement dépendre fortement de l'ordre. Merci!


Le processus de routage dépend généralement de l'ordre des règles, de sorte que la caractéristique «commande» peut être importante.


Veuillez consulter ma réponse pour deux techniques qui vous permettent de commander l'enregistrement de la zone (et donc de leurs itinéraires) dans n'importe quel ordre.


Bien et bien, mais ce n'était pas pensé dans notre solution actuelle. Maintenant, lorsque nous mettrons à niveau VS2015, le compilateur a inexplicablement modifié l'ordre informatique, il ajoute des enregistrements de la zone ... Changements de rupture Tout tour - une solution simple aurait été d'ajouter la commande (comme un attribut? À peine complexe), nous devons maintenant utiliser @ Ellon's Solution



30
votes

Outre ce que Haacked a dit, il est très possible de commander des enregistrements de zone (et donc de leurs itinéraires). Tout ce que vous avez à faire est d'enregistrer chaque zone manuellement, dans n'importe quel ordre souhaité. Ce n'est pas aussi élégant que Calling RegiskallAreas () mais c'est définitivement faisable.

protected void Application_Start() {
    var area1reg = new Area1AreaRegistration();
    var area1context = new AreaRegistrationContext(area1reg.AreaName, RouteTable.Routes);
    area1reg.RegisterArea(area1context);

    var area2reg = new Area2AreaRegistration();
    var area2context = new AreaRegistrationContext(area2reg.AreaName, RouteTable.Routes);
    area2reg.RegisterArea(area2context);

    var area3reg = new Area3AreaRegistration();
    var area3context = new AreaRegistrationContext(area3reg.AreaName, RouteTable.Routes);
    area3reg.RegisterArea(area3context);
}


1 commentaires

Très bonne réponse. En outre, moins de code si vous faites une méthode, puis une ligne de code par zone.



4
votes

Je fais cette solution:

zoneUtils.cs p> xxx pré>

dans global.asax: p> xxx pré> non Modifications requises dans le code d'enregistrement de zone généré. J'utilise également une constructeur personnalisée dans les itinéraires pour filtrer les itinéraires par type de domaine sur demande (domaine système ou site utilisateur). P>

Il s'agit d'inscriptions de zone comme exemple: P>

namespace SledgeHammer.MVC.Site.Areas.System
{
    public class SystemAreaRegistration : AreaRegistration
    {
        public override string AreaName
        {
            get { return "System"; }
        }

        public override void RegisterArea(AreaRegistrationContext context)
        {
            context.MapRoute(
                "System_Feedback",
                "Feedback",
                new { controller = "Feedback", action = "Index" }
            );
            context.MapRoute(
                "System_Information",
                "Information/{action}/{id}",
                new { controller = "Information", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
}



namespace SledgeHammer.MVC.Site.Areas.ClientSites
{
    public class ClientSitesAreaRegistration : AreaRegistration
    {
        public override string AreaName
        {
            get { return "ClientSites"; }
        }

        public override void RegisterArea(AreaRegistrationContext context)
        {
            context.MapRoute(
                "ClientSites_default",
                "{controller}/{action}/{id}",
                new { controller = "Site", action = "Index", id = UrlParameter.Optional },
                new { Host = new SiteInGroups("clients") }
            );
        }
    }
}


1 commentaires

Votre classe UTIL est géniale car elle indique que vous devez ajouter l'espace de noms pour les zones, sinon les routs ne seront pas liés aux contrôleurs.



4
votes

Pour référence,

dans MVC3 (ne sait pas à propos de MVC2) lorsque vous souhaitez simplement mapper la racine à une zone / contrôleur spécifique, vous pouvez simplement utiliser un itinéraire global. N'oubliez pas de spécifier l'espace de noms / la zone. xxx


2 commentaires

+1 - C'est une belle solution car elle permet de regrouper tout dans les zones, mais une zone à servir de capture avec une URL plus propre.


Marche parfaitement! Permettez-moi de disposer de tous les contrôleurs dans des zones plutôt que des zones «spéciales» et réelles. Pour que quiconque souhaite la même chose, enregistrez la route par défaut dans la route Config.