تعلم ASP.NET MVC


الدرس: تنظيم مشروعك بشكل أفضل مع المناطق (Areas)


الصفحة السابقة
كلما زاد نمو تطبيق الويب الخاص بك ، كلما زاد عدد واجهات العرض ووحدات التحكم. بعد فترة ، يمكن أن تصبح فوضى كبيرة بسرعة.
لحل هذه المشكلة ، من الممكن تقسيم تطبيقه إلى مناطق ، والتي تسمى باللغة الإنجليزية "Areas " . هذا يسمح بشكل خاص بتجميع العناصر حسب المجال الوظيفي. لنأخذ مثالنا على موقع تعليمي مثل موقع ArabClassroom . يمكن أن يكون لدينا منطقة دروس ، منطقة منتدى ، منطقة أخبار ، منطقة إدارية ، إلخ.
دعونا نرى كيفية إعداد هذا.

قم بإنشاء منطقة


لتوضيح المناطق ، سأقوم بإنشاء مشروع وهمي صغير لن يفعل الكثير باستثناء أن يريك كيف يعمل. لذا أترك مشروعًا فارغًا أسميه DemoAreas . أضفت وحدة تحكم Home   مع إجراء الفهرس من أجل الحصول على منطقة رئيسية. ثم أضفت طريقة عرض بسيطة للغاية. حسنا ، كل ذلك ، يمكنك القيام به .
الآن دعنا نضيف منطقة. انقر بزر الماوس الأيمن على مشروعك واختر إضافة منطقة:
ASP.NET framework
إضافة منطقة
وتسميته على سبيل المثال Administration   :
ASP.NET framework
اختيار اسم المنطقة
يقوم Visual Studio بعدة أشياء.
أولاً ، يقوم بإنشاء مجلد المناطق يحتوي على دليل فرعي للإدارة يحتوي على نماذج فرعية ووحدات تحكم وطرق عرض:
ASP.NET framework
الشجرة بعد إنشاء المنطقة
باختصار ، شيء نعلمه جيدًا حيث يمكننا وضع وحدات تحكم وآراء ونموذج ، كل ذلك في منطقة " Administration  " . مثل الموقع المصغر في الموقع.
ثانيًا ، أنشأ Visual Studio ملف AdministrationAreaRegistration.cs ، والذي يحتوي على الكود التالي:

public class AdministrationAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "Administration";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Administration_default",
            "Administration/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
        );
    }
}
إنها فئة مشتقة من الطبقة الأساسية AreaRegistration  . يمكننا أن نرى بشكل خاص أن Visual Studio يحدد مسارًا محددًا لمنطقة الإدارة الخاصة بنا والذي يبدأ بالبادئة / .
الآن يمكننا إضافة وحدات تحكم وطرق عرض كما نعرف بالفعل كيفية القيام بذلك. على سبيل المثال ، قم بإنشاء وحدة تحكم Administration   في مجلد /Areas/Administration/Controllers :

public class AdministrationController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}
ثم عرض Index.cshtml في /Areas/Administration/Views/Administration . بالطبع ، إذا كنت تستخدم الاختصار لإنشاء العرض من وحدة التحكم ، فسيذهب تلقائيًا إلى المكان الصحيح . تحتوي :

@{
ViewBag.Title = "Index d'administration";
}
<h2>Index d'administration</h2>
إعادة الترجمة ، يمكنك الآن الوصول إلى طريقة عرض الإدارة الخاصة بك باستخدام عنوان URL /Administration/Administration/Index . نجد بالطبع النمط المحدد في الفصل الذي أنشأه Visual Studio ، وهو "Administration / {controller} / {action} / {id}" .
لاحظ أن ASP.NET MVC يأخذ هذا المسار الجديد في الاعتبار لأنه يوجد في الملف global.asax.cs سطر من التعليمات البرمجية مما يجعل من الممكن اكتشاف جميع المناطق وحفظها. هذه هي:

AreaRegistration.RegisterAllAreas();
إذا علقت عليها ، سترى أن المنطقة لم تعد تعمل. لكن لا تعلق عليها. 

مناطق بها وحدات تحكم تحمل نفس الاسم


هذه المناطق عملية للغاية ، لكننا سنواجه مشكلة بسرعة إذا اتصلت بوحدات التحكم الخاصة بك من مناطق مختلفة بنفس الاسم. في الفصل السابق ، لا توجد مشاكل. كان لدينا وحدة تحكم Home  تقع في  /Controllersووحدة تحكم Administration   تقع في /Areas/Administration/Controllers .
ولكن قد يحدث أننا نريد إنشاء وحدة تحكم Home   في منطقة ما. جرب التجربة وأضف وحدة تحكم Home   في منطقة الإدارة الخاصة بنا.
ثم انتقل إلى جذر الموقع ، تحصل على الخطأ التالي:
تم العثور على العديد من الأنواع المقابلة لجهاز التحكم المسمى "Home " . يمكن أن يحدث هذا إذا لم يحدد المسار الذي يعالج هذا الطلب ('{controller} / {action} / {id}') مساحات أسماء للعثور على وحدة تحكم تتوافق مع الطلب. إذا كانت هذه هي الحالة ، فقم بحفظ هذا المسار عن طريق استدعاء تحميل زائد لطريقة "MapRoute" التي تأخذ مُدخل "مساحات الأسماء" .
وجد طلب "Home" وحدات التحكم المطابقة التالية:
DemoAreas.Areas.Administration.Controllers.HomeController
DemoAreas.Controllers.HomeController
الخطأ واضح جدًا ، هناك مرتين واحدة HomeController   بمساحة اسم مختلفة. الحل المقترح هو أيضًا ، فهو يخبرك أنه يجب عليك استخدام تحميل زائد لتمرير مساحة الاسم عند تحديد المسار.
انظر إلى مساحة اسم وحدة التحكم الرئيسية ( في المنزل DemoAreas.Controllers  ) وقم بتعديل المسار الافتراضي الموجود في ملف RouteConfig.cs ليكون لديك:

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[] { "DemoAreas.Controllers" }
        );
    }
}
وبالتالي ، من خلال إضافة خاصية مساحات الأسماء ، أشر إلى المسار الذي يجب أن يبحث فيه عن وحدات التحكم في مساحة الاسم DemoAreas.Controllers ، بحيث لا يكون هناك خطر من تعارض الأسماء.

قم بإنشاء عنوان URL لإجراء من قبل وحدة تحكم المنطقة


رأينا سابقًا أن آلية التوجيه كانت قادرة على إنشاء عنوان URL من اسم وحدة التحكم واسم الإجراء.
يمكنه أيضًا القيام بذلك مع المناطق ولكن يجب علينا بالطبع استخدام حمولة زائدة مختلفة تأخذ اسم المسار كمُدخل.
يتم ذلك ، على سبيل المثال لإنشاء رابط إلى وحدة التحكم الإدارية لدينا:

@Html.ActionLink("Aller à l'écran d'administration", "Index", "Administration", new {area = "Administration"}, null)
لذلك نستخدم مُدخل منطقة المسار لتمرير اسم المنطقة. وهنا الرابط الذي يولد:

<a href="/Administration/Administration">Aller à l'écran d'administration</a> ;

باختصار


  • المناطق هي آلية لتنظيم مشروعك بشكل أفضل عندما يصبح كبيرًا.
  • من الممكن أن يكون لديك وحدات تحكم بأسماء متطابقة إذا أخبرنا المسار الذي توجد به مساحة الاسم للبحث عن وحدة التحكم.
  • لإنشاء ارتباط إلى إجراء بواسطة وحدة تحكم المنطقة ، يجب عليك تمرير اسم المنطقة في مُدخلات التوجيه.