سؤال

ولقد لاحظت أنه في MVC 2 معاينة 2، AreaRegistration يتم تحميل الطرق لكل منطقة في أمر تعسفي. هل هناك طريقة جيدة للحصول على واحد قبل الآخر؟

وعلى سبيل المثال، لدي اثنين من المجالات - "الموقع" و "المسؤول". لديهما وحدة تحكم "المدونة".

وأود يلي:

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

والمشكلة هي أنه يتم تحميل مسار الموقع لأول مرة، لذلك هو مطابقة {controller}/{action}/{id} بدلا من admin/{controller}/{action}/{id} عندما أذهب إلى رابط "/ المشرف /". وبعد ذلك الحصول على 404، لأنه لا يوجد تحكم Admin في المنطقة "الموقع".

وكل المناطق الافتراضي إلى وحدة تحكم "المدونة". أنا أدرك أنني يمكن ببساطة site/{controller}/... كما عنوان الموقع، ولكن أود أن يكون ذلك بدلا من جذورها إن أمكن. كما أنني حاولت الحفاظ على المسار الافتراضي في وظيفة RegisterRoutes العالمية، ومع ذلك، ثم لا إرساله إلى منطقة "مواقع".

ويرجع الفضل في ذلك مسبقا!

هل كانت مفيدة؟

المحلول

وحاليا ليس من الممكن أن تأمر المناطق. ومع ذلك، أعتقد أنه من المنطقي في محاولة لجعل كل منطقة مستقلة اعتبارا من مناطق أخرى ممكن حتى لا يهم هذا الأمر.

وعلى سبيل المثال، بدلا من الاضطرار الافتراضي {تحكم} / {العمل} / {معرف} الطريق، وربما الاستعاضة عن ذلك مع طرق محددة لكل وحدة تحكم. أو إضافة قيد إلى هذا الطريق الافتراضية.

ونحن تفكر في خيارات للسماح للترتيب، لكننا لا نريد أن overcomplicate هذه الميزة.

نصائح أخرى

وبصرف النظر عن ما قاله Haacked، فمن الممكن كثيرا أن تأمر التسجيلات منطقة (وبالتالي طرقهم). كل ما عليك القيام به هو تسجيل كل منطقة يدويا، أيا كان النظام الذي تريد. انها ليست أملس مثل استدعاء RegisterAllAreas () إلا أنها قابلة للتنفيذ بالتأكيد.

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

وثمة خيار آخر هو أن تأخذ رمز RegisterAllAreas ()، بنسخه إلى التطبيق الخاص بك، وبناء آلية الخاصة بك لتحديد النظام. ومن لا بأس به من التعليمات البرمجية لنسخ إذا كنت تريد كل منطق التخزين المؤقت يتوهم أن أسلوب مضمنة لا، ولكن قد التطبيق لا تحتاج حتى ذلك.

وأنا جعل هذا الحل:

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

    }

في global.asax:

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

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

ولم تحدث تعديلات يلزم تسجيل لرمز التسجيل المنطقة التي تم إنشاؤها. أود أيضا أن استخدام constrant مخصصة في طرق لتصفية طرق حسب نوع المجال في الطلب (نطاق النظام أو الموقع المستخدم).

وهذا هو تسجيل منطقتي كمثال:

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

لمرجعية،

في MVC3 (لا أعرف عن MVC2) عندما كنت ترغب فقط في تعيين الجذر إلى منطقة / وحدة تحكم المحدد الذي يمكن ببساطة استخدام طريقا العالمي. فقط تذكر لتحديد مساحة / المنطقة.

    routes.MapRoute(
      "CatchRoot", "",
      new { controller = "SITEBLOG-CONTROLLER-NAME", action = "Index"} 
     ).DataTokens.Add("area", "SITE-AREA-NAME");
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top