سؤال

أنا في الطريق لإنشاء تطبيق ASP.NET MVC مع أحدث إصدار من التجريبي وأتساءل عما إذا كان من الممكن تغيير تخطيط المشروع الافتراضي لـ

/views/home/index.aspx /views/home/about.aspx

إلى

/blog/views/home/index.aspx /blog/views/home/about.aspx

/forum/views/home/index.aspx/forum/views/home/about.aspx

الهدف من ذلك هو الحصول على بعض الفصل بين "التطبيقات" داخل مشروع ويب واحد ، وهو شيء مثل توماس أوينز طلب بالفعل هنا: بموجب إطار عمل MVC ، أي هيكل الدليل يتوقعه المطورون الآخرون؟

بالطبع يجب أن يشمل هذا وحدات التحكم أيضًا ، وليس فقط وجهات النظر.

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

المحلول

ليست فكرة جديدة. يطلق عليه "المناطق" في monorail. كان هناك الكثير من الطنانة حول هذا الموضوع مؤخرًا على منتدى ATL.NET وفي أماكن أخرى. توصل ستيف ساندرسون إلى أ طريقة للقيام بذلك ولكن يبدو أنه يترك بعض القضايا. في Response ، يبدو أن فريق MVC سوف يأخذ "نظرة عميقة"في ذلك لإصدار مستقبلي.

نصائح أخرى

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

الخطوة الأولى هي تعديل المسار الافتراضي لتضمين اسم التطبيق الخاص بك:

routes.MapRoute("Default",
                "{applicationName}/{controller}/{action}/{id})",
                null, null);

أفترض أنك ستجمع "التطبيقات" في مساحات أسماء مختلفة داخل مجموعة واحدة. لذلك قد يكون لديك مساحتان أسماء مثل:

  • myapp.blog.controllers
  • myapp.forum.controllers

بعد ذلك ، تحتاج إلى تغيير مصنع وحدة التحكم بحيث يقوم بتثبيت وحدة التحكم الصحيحة. يمكنك القيام بذلك عن طريق النوع الفرعي لـ DefaultControllerFactory والتجاوز طريقة GetControllerType:

    protected override System.Type GetControllerType(string controllerName)
    {
        string applicationName;
        if (RequestContext != null && 
           RequestContext.RouteData.Values.TryGetValue(
           "applicationName", out applicationName)) {
           // return controller type using app name to 
           // look up namespace and controllerName argument
           return ...
        }

        // if no match, maybe it's a different controller/route
        return base.GetControllerType(controllerName);
    }

أخيرًا ، تحتاج إلى إخبار MVC باستخدام وحدة التحكم الخاصة بك. في global.asax.cs:

    private void Application_Start(object sender, EventArgs e)
    {
        RegisterRoutes(RouteTable.Routes);
        ControllerBuilder.Current.SetControllerFactory(
            MyApp.MyControllerFactory());
    }

يمكن معالجة تحديد المشاهدات بشكل مشابه. في هذه الحالة ، أنت من النوع الفرعي WebFormViewEngine.

لقد كتبت للتو منشورًا للمدونة الذي يصف طريقة واحدة لتجميع وحدات التحكم التي تشبه "المناطق" في Monorail. لا يعالج المناطق المتداخلة بعد.

http://haacked.com/archive/2008/11/04/areas-in-aspnetmvc.aspx

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top