Frage

bemerkte ich, dass 2 in MVC 2 Preview, AreaRegistration die Routen in beliebiger Reihenfolge für jeden Bereich wird geladen. Gibt es eine gute Möglichkeit, eine vor dem anderen zu bekommen?

Zum Beispiel habe ich zwei Bereiche - „Site“ und „Admin“. Beide haben einen „Blog“ Controller.

Ich möchte folgendes:

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

Das Problem ist, dass es die Website der Route wird geladen ersten, so ist es passend {controller}/{action}/{id} statt admin/{controller}/{action}/{id}, wenn ich auf die URL gehen „/ admin /“. Ich erhalte dann eine 404, weil es keine Admin-Controller in der "Site" Bereich ist.

Beide Bereiche standardmäßig auf den "Blog" Controller. Ich weiß, ich einfach site/{controller}/... als die URL setzen könnte, aber ich würde es eher an der Wurzel haben, wenn möglich. Ich habe auch versucht die Standardroute in der globalen RegisterRoutes Funktion zu halten, wird es jedoch dann nicht auf die „Sites“ Bereich gesendet.

Vielen Dank im Voraus!

War es hilfreich?

Lösung

Es ist zur Zeit nicht möglich, Bereiche zu bestellen. Aber ich denke, es sinnvoll, jeden Bereich als aus anderen Bereichen wie möglich unabhängig zu versuchen, macht und machen so die Reihenfolge keine Rolle spielt.

Zum Beispiel, anstelle den Standard mit {Controller} / {Aktion} / {id} Route ersetzen vielleicht, dass mit spezifischen Routen für jeden Controller. Oder fügen Sie eine Einschränkung auf diese Standardroute.

Wir sind grübelt über Optionen Bestellung zu ermöglichen, aber wir wollen nicht, um die Funktion verkomplizieren.

Andere Tipps

Abgesehen von dem, was Haacked sagte, es ist sehr viel möglich Bereich Registrierungen zu bestellen (und damit ihre Routen). Alles, was Sie tun müssen, ist jeder Bereich manuell registrieren, in welcher Reihenfolge Sie wollen. Es ist nicht so glatt wie der Aufruf von RegisterAllAreas (), aber es ist auf jeden Fall machbar.

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

Eine andere Möglichkeit ist, den Code für RegisterAllAreas zu nehmen (), kopieren Sie sie in Ihre eigene App, und Ihre eigenen Mechanismus bauen die Reihenfolge zu bestimmen. Es ist ziemlich viel Code zu kopieren, wenn Sie alle Phantasie Caching-Logik wollen, dass die integrierte Methode funktioniert, aber Ihre Anwendung vielleicht nicht einmal, dass müssen.

Ich mache diese Lösung:

AreaUtils.cs

    using System;
    using System.Web.Mvc;
    using System.Web.Routing;

    namespace SledgeHammer.Mvc.Site
    {
        public static class Utils
        {
                public static void RegisterArea<T>(RouteCollection routes,
    object state) where T : AreaRegistration

            {
                 AreaRegistration registration =
     (AreaRegistration)Activator.CreateInstance(typeof(T));

                    AreaRegistrationContext context =
     new AreaRegistrationContext(registration.AreaName, routes, state);

                    string tNamespace = registration.GetType().Namespace;
                    if (tNamespace != null)
                {
                    context.Namespaces.Add(tNamespace + ".*");
                }

                registration.RegisterArea(context);
            }
        }

    }

In global.asax:

Utils.RegisterArea<SystemAreaRegistration>(RouteTable.Routes, null);
Utils.RegisterArea<ClientSitesAreaRegistration>(RouteTable.Routes, null);

//AreaRegistration.RegisterAllAreas(); do not dublicate register areas

Keine requred Änderungen erzeugt Bereich Registrierungscode. Ich benutze auch benutzerdefinierte constrant in Routen Routen zum Filtern nach Art der Domain in Anforderung (Systemdomäne oder Benutzer-Website).

Das ist mein Bereich Registrierungen als Beispiel:

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

Als Referenz

In MVC3 (weiß nicht, über MVC2), wenn Sie root auf einen bestimmten Bereich / Controller nur abbilden möchten Sie einfach eine globale Route nutzen könnten. Denken Sie daran, den Namensraum / Gebiet angeben.

    routes.MapRoute(
      "CatchRoot", "",
      new { controller = "SITEBLOG-CONTROLLER-NAME", action = "Index"} 
     ).DataTokens.Add("area", "SITE-AREA-NAME");
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top