کار با Areas را تا ASP.NET MVC 5.x میتوانید در مطلب «ASP.NET MVC #14» مطالعه کنید. در ASP.NET Core، کلیات آن ثابت ماندهاست و تنظیمات ابتدایی آن اندکی تغییر کردهاند.
مفهوم Areas
Areas یکی از روشهای ساماندهی برنامههای بزرگ، به نواحی کوچکتری مانند قسمتهای مدیریتی، پشتیبانی از کاربران و غیره است. به این ترتیب میتوان کنترلرها، Viewها و مدلهای هر قسمت را از قسمتی دیگر، جدا کرد و مدیریت پروژه را سادهتر نمود. هر Area دارای ساختار پوشههای مرتبط به خود میباشد و به این نحو است که جداسازی این نواحی مختلف را میسر میکند؛ تا بهتر مشخص باشد که هر المانی متعلق است به چه ناحیهای. به علاوه در این حالت میتوان پروژه را بین چندین توسعه دهندهی مختلف نیز تقسیم کرد؛ بدون اینکه در کار یکدیگر تداخلی ایجاد کنند.
ایجاد Areas
اگر با ASP.NET MVC 5.x کار کرده باشید، میدانید که ویژوال استودیو با کلیک راست بر روی پروژهی جاری، گزینه افزودن یک Area جدید را به همراه دارد. یک چنین قابلیتی تا ASP.NET Core 1.1 به ابزارهای همراه آن افزوده نشدهاست. بنابراین تمام مراحل ذیل را باید دستی ایجاد کنید و هنوز قالب از پیش تعریف شده و ساده کنندهای برای اینکار وجود ندارد:
همانطور که در تصویر نیز ملاحظه میکنید، نیاز است در ریشهی پروژه، پوشهی جدیدی را به نام Areas ایجاد کرد. سپس در داخل این پوشه میتوان نواحی مختلفی را با پوشه بندیهای مجزایی ایجاد نمود. برای مثال در اینجا ناحیهی Blog ایجاد شدهاست که در این ناحیه نیز پوشههای Controllers و Views آن باید به صورت دستی ایجاد شوند.
افزودن مسیریابی مرتبط با Areas
پس از اضافه کردن دستی پوشههای Areas و ناحیهی جدید، به همراه ساختار پوشههای کنترلرها و Viewهای آن، اکنون نیاز است این ناحیهی جدید را به سیستم مسیریابی معرفی نمود. برای این منظور به فایل آغازین برنامه مراجعه کرده و در متد Configure آن، تعریف جدید ذیل را اضافه میکنیم:
مسیریابی پیشفرض را در مطلب «ارتقاء به ASP.NET Core 1.0 - قسمت 9 - بررسی تغییرات مسیریابی» پیشتر بررسی کردهایم. در اینجا پیش از این مسیریابی، مسیریابی جدید areas تعریف شدهاست. قید exists در اینجا به معنای تنها استفادهی از نواحی تعریف شدهی در برنامهی جاری است و الگوی تعریف شده، تمام آنها را شامل میشود و دیگر نیازی به تعریف مسیریابی جداگانهای به ازای ایجاد هر Area جدید نیست (برخلاف ASP.NET MVC 5.x).
علامتگذاری کنترلرهای یک ناحیه
تمام اصول کار کردن با کنترلرهای یک ناحیه، مانند سایر کنترلرهای دیگر برنامهاست؛ با یک تفاوت:
در ASP.NET Core حتما نیاز است توسط ویژگی جدید Area، نام ناحیهی کنترلر را صریحا مشخص کرد؛ در غیراینصورت، صرفنظر از محل تعریف این کنترلر، اطلاعات آن متعلق به هیچ ناحیهای نبوده و وارد سیستم مسیریابی Areas نمیشود.
یک نکته: اگر از Attribute routing استفاده میکنید، توکن مرتبط با نواحی، [area] نام دارد:
فعالسازی Layout و Tag Helpers در Areas
اگر در همین حال، برنامه را اجرا و به مسیر http://localhost/blog مراجعه کنید، هرچند اطلاعات View متناظر با کنترلر Home و اکشن متد Index آن نمایش داده میشوند، اما این View نه layout دارد و نه Tag helpers آن پردازش شدهاند. برای فعالسازی این دو مورد، دو فایل ViewStart.cshtml_ و ViewImports.cshtml_ را از پوشهی views اصلی پروژه، به پوشهی views این Area جدید کپی کنید. فایل ViewStart، نام و مسیر فایل layout پیش فرض ناحیه را مشخص میکند و فایل ViewImports حاوی تعاریف فعالسازی Tag helpers است:
هر Area میتواند layout خاص خودش را داشته باشد؛ اما اگر فایل ViewStart آن به نحو ذیل مقدار دهی شود، به فایل اصلی واقع در پوشهی Views/Shared/_Layout.cshtml ریشهی پروژه، اشاره میکند.
و برای تغییر و یا مقداردهی صریح آن میتوان به صورت ذیل عمل کرد:
Areas و تاثیر آنها در حین لینک دهی به قسمتهای مختلف برنامه
اگر قرار است لینکی به قسمتی واقع در همان Area جاری مرتبط شود، نیازی نیست تا هیچ نکتهی خاصی را درنظر گرفت و تولید لینکها به نحو صحیحی صورت میگیرند:
اما اگر میخواهیم به ناحیهی جدیدی به نام Services و کنترلر و اکشن متد خاصی از آن، از یک ناحیهی دیگر لینک دهیم، نیاز است asp-area را صریحا ذکر کرد:
به علاوه اگر قصد تعریف لینکی را به یک اکشن متد واقع در کنترلری که در هیچ ناحیهای قرار ندارد، داشته باشیم، باید asp-area آنرا خالی ذکر کنیم:
تاثیر Areas بر روی تنظیمات توزیع برنامه
فایلهای View موجود در Areas نیز باید در حین توزیع نهایی برنامه ارائه شوند؛ مگر اینکه آنها را از پیش کامپایل کرده باشیم. اگر از حالت از پیش کامپایل کردن Viewها استفاده نمیشود، نیاز است قسمت publishOptions فایل project.json را به نحو ذیل در جهت الحاق فایلهای Viewهای نواحی مختلف، ویرایش و تکمیل کرد:
مفهوم Areas
Areas یکی از روشهای ساماندهی برنامههای بزرگ، به نواحی کوچکتری مانند قسمتهای مدیریتی، پشتیبانی از کاربران و غیره است. به این ترتیب میتوان کنترلرها، Viewها و مدلهای هر قسمت را از قسمتی دیگر، جدا کرد و مدیریت پروژه را سادهتر نمود. هر Area دارای ساختار پوشههای مرتبط به خود میباشد و به این نحو است که جداسازی این نواحی مختلف را میسر میکند؛ تا بهتر مشخص باشد که هر المانی متعلق است به چه ناحیهای. به علاوه در این حالت میتوان پروژه را بین چندین توسعه دهندهی مختلف نیز تقسیم کرد؛ بدون اینکه در کار یکدیگر تداخلی ایجاد کنند.
ایجاد Areas
اگر با ASP.NET MVC 5.x کار کرده باشید، میدانید که ویژوال استودیو با کلیک راست بر روی پروژهی جاری، گزینه افزودن یک Area جدید را به همراه دارد. یک چنین قابلیتی تا ASP.NET Core 1.1 به ابزارهای همراه آن افزوده نشدهاست. بنابراین تمام مراحل ذیل را باید دستی ایجاد کنید و هنوز قالب از پیش تعریف شده و ساده کنندهای برای اینکار وجود ندارد:
همانطور که در تصویر نیز ملاحظه میکنید، نیاز است در ریشهی پروژه، پوشهی جدیدی را به نام Areas ایجاد کرد. سپس در داخل این پوشه میتوان نواحی مختلفی را با پوشه بندیهای مجزایی ایجاد نمود. برای مثال در اینجا ناحیهی Blog ایجاد شدهاست که در این ناحیه نیز پوشههای Controllers و Views آن باید به صورت دستی ایجاد شوند.
افزودن مسیریابی مرتبط با Areas
پس از اضافه کردن دستی پوشههای Areas و ناحیهی جدید، به همراه ساختار پوشههای کنترلرها و Viewهای آن، اکنون نیاز است این ناحیهی جدید را به سیستم مسیریابی معرفی نمود. برای این منظور به فایل آغازین برنامه مراجعه کرده و در متد Configure آن، تعریف جدید ذیل را اضافه میکنیم:
app.UseMvc(routes => { routes.MapRoute( name: "areas", template: "{area:exists}/{controller=Home}/{action=Index}/{id?}"); routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); });
علامتگذاری کنترلرهای یک ناحیه
تمام اصول کار کردن با کنترلرهای یک ناحیه، مانند سایر کنترلرهای دیگر برنامهاست؛ با یک تفاوت:
[Area("Blog")] public class HomeController : Controller { public IActionResult Index() { return View(); } }
یک نکته: اگر از Attribute routing استفاده میکنید، توکن مرتبط با نواحی، [area] نام دارد:
[Route("[area]/app/[controller]/actions/[action]/{id:weekday?}")]
فعالسازی Layout و Tag Helpers در Areas
اگر در همین حال، برنامه را اجرا و به مسیر http://localhost/blog مراجعه کنید، هرچند اطلاعات View متناظر با کنترلر Home و اکشن متد Index آن نمایش داده میشوند، اما این View نه layout دارد و نه Tag helpers آن پردازش شدهاند. برای فعالسازی این دو مورد، دو فایل ViewStart.cshtml_ و ViewImports.cshtml_ را از پوشهی views اصلی پروژه، به پوشهی views این Area جدید کپی کنید. فایل ViewStart، نام و مسیر فایل layout پیش فرض ناحیه را مشخص میکند و فایل ViewImports حاوی تعاریف فعالسازی Tag helpers است:
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@{ Layout = "_Layout"; }
@{ Layout = "~/Areas/Blog/Views/Shared/_Layout.cshtml"; }
Areas و تاثیر آنها در حین لینک دهی به قسمتهای مختلف برنامه
اگر قرار است لینکی به قسمتی واقع در همان Area جاری مرتبط شود، نیازی نیست تا هیچ نکتهی خاصی را درنظر گرفت و تولید لینکها به نحو صحیحی صورت میگیرند:
<a asp-action="Index" asp-controller="Home">Link</a>
<a asp-area="Services" asp-controller="Home" asp-action="Index">Go to Services’ Home Page</a>
<a asp-action="Index" asp-controller="Home" asp-area="">Link</a>
تاثیر Areas بر روی تنظیمات توزیع برنامه
فایلهای View موجود در Areas نیز باید در حین توزیع نهایی برنامه ارائه شوند؛ مگر اینکه آنها را از پیش کامپایل کرده باشیم. اگر از حالت از پیش کامپایل کردن Viewها استفاده نمیشود، نیاز است قسمت publishOptions فایل project.json را به نحو ذیل در جهت الحاق فایلهای Viewهای نواحی مختلف، ویرایش و تکمیل کرد:
"publishOptions": { "include": [ "Areas/**/*.cshtml", .... .... ]