لایه ها در MVC چیزی بیش از فایل های نما نیستند و از این رو آنها دارای پسوند cshtml و درون مایه کدهای HTML و  عبارت های سی شارپ هستند. ولی فایل لایه چیست و چه تفاوتی با فایل های نما رایج دارد؟ لایه ها در واقع فایل های نمایی هستند که پایه ای برای دیگر فایل های نما به کار می روند، بدین مفهوم که کدهای HTML تکراری را یک بار در یک فایل cshtml می نویسیم و سپس آنها را به درون دیگر فایل های نما پیوست داده و سپس دیگر بخش های تازه برای هر فایل نما را به درون فایل نما می افزاییم.

نوشتن یک فایل لایه

در کد شکل زیر سه بخش از یک فایل نما را به شما نشان داده ایم که در آن دو عبارت سی شارپ نو به نام ()RenderBody@ و ()RenderSection@ را می بینید که بخشی از Razor Engien هستند و در این نوشته درباره آنها خواهیم گفت. پیش از هر چیز دوباره می خواهیم درباره [“ViewData[“Title@ بگوییم. گفتیم یک داده برای فرستاده شدن می تواند در آغاز فایل نما یا درون یک متد کنترل گر شناسانده (تعریف) شوند. کد شکل زیر یک فایل با کاربرد لایه است و به گونه ای آماده شده است که بدون توجه به فایل نمایی که این فایل لایه در آن پیویست می شود، به گونه پیش فرض، اگر در هر جایی [“ViewData[“Titile@ شناسانده شده باشد، پس مقدار آن در میان تگ <title> نوشته می شود. اکنون به کد زیر که دو متد ()Index و ()Privacy را نشان می دهد نگاه کنید و می بینید که [“ViewData[“Titile@ در آنها نوشته نشده است، پس [“ViewData[“Titile@ در کجا نوشته شده است؟؟؟

کد زیر درون مایه فایل نما Index.cshtml در مسیر Views/Home است که می بینید در بالای آن و درون عبارت {}@ مقدار [“ViewData[“Title@ نوشته شده است. در اینجا مقدار Home Page برای آن نوشته شده است ولی اگر فایل Privacy.cshtml را نگاه کنید، می بینید که مقدار Privacy Policy برای آن نوشته شده است. بنابراین در هر فایل نما، چون پیش فرض فایل لایه پیش فرض در پروژه پیوست می شود، پس مقدار [“ViewData[“Title@ در جایی که شما مشخص می کنید، نوشته می شود.

متد ()RenderBody از Razor

گفتیم که Razor موتور نما است که به کمک متدها و عبارت های که به زبان سی شارپ هستند فایل های نما را در کنار کدهای HTML می سازند. در بَند (خط) ۲۹ از کد شکل بالا می توانید آن را درون یک تگ div با کلاس به نام container ببینید. خود تگ div درون بدنه HTML و در واقع درون تگ body است. توجه کنید پروژه ASP.NET Core MVC پیش فرض از Bootstrap کمک می گیرد، پس کلاس container یک کلاس پیش فرض در Bootstrap است. متد ()RenderBody ابزاری از Razor است که بخشی از محتوای فایل نما را نشان می دهد که این بخش دارای یک نام یا شناسه آشکار نیست.

اکنون دوباره فایل Index.cshtml را نگاه کنید، هر چیزی که زیر عبارت {}@ نوشته شود، در واقع جایگزین بخشی می شود که این بخش با متد ()RenderBody مشخص شده است. در واقع پیش فرض لایه به درون همه فایل های نما پیوست شده که در پروژه های ASP.NET Core MVC 3، فایل لایه دارای یک بخش بی نام است که این بخش به کمک ()RenderBody مشخص شده است. در کد زیر بخشی از فایل Index.cshtml آورده شده است که در زیر عبارت {}@ نوشته شده و از این رو جایگزین ()RenderBody می شود.

لایه پیش فرض

در پروژه های ASP.NET Core MVC و در مسیر Views/Layouts فایلی به نام Layout.cshtml_ است که لایه پیش فرض برای تمامی فایل های نما است. در این فایل، تمامی فایل های CSS و Javascript آورده شده اند، که می خواهیم این فایل های سی اس اس و جاوا اسکریپت در همه فایل های نما پیوست شوند. شکل کد آغازین این نوشته درون مایه (محتوای) فایل Layout.cshtml_ را نشان می دهد.

اگر بخواهیم که یک نما لایه پیش فرض را به کار نبرد چه کاری باید انجام داد؟ اگر نوشته  را به یاد داشته باشید، گفتیم که عبارت ;Layout=null درون {}@ باعث می شود تا فایل نما، لایه پیش فرض را به کار نبرد. کد زیر چگونگی عدم استفاده از فایل لایه پیش فرض در فایل Index.cshtml را نشان می دهد. شکل زیر نیز خروجی پس از این تغییر را نشان می دهد.

در شکل بالا می بینید که دیگر عنوان نوشته شده آغاز فایل Index.cshtml نشان داده نمی شود و همچنین می بینید که دیگر Bootstrap بر روی فایل Index.cshtml اعمال نشده است. چرایی (دلیل) آن این است که هر دوی این موردها در فایل لایه شناسانده شده بودند و چون از لایه صرف نظر کردیم، پس دیگر [“ViewData[“Titile@ در جای خودش نشان داده نمی شود. در کد زیر به صورت دستی تگ <title> را به فایل نما افزوده ایم.

همچنین شما می توانید یک فایل لایه را دستی درون یک فایل نما پیوست کنید. برای نمونه می خواهید فایل Layout.cshtml_ را برای یک فایل نما به کار ببرید، پس باید عبارت ;”Layout = “_Layout را درون {}@ بنویسید.

ساخت بخش های گوناگون داری نام

در کنار ()RenderBody متد دیگری به نام ()RenderSection است که یک ورودی رشته را به عنوان نام آن بخش دریافت می کند. برای نمونه در کد زیر یک بخش به نام main را شناسانده (تعریف کرده) ایم که جایگزین ()RenderBody پیشین است. اکنون با شناساندن ان بخش، نیاز است تا در بدنه نما، نام بخش را نیز آشکارا نشان دهیم.

اکنون که در فایل لایه و به کمک ()RenderSection یک بخش دارای نام را مشخص کردیم، سپس باید در فایل نما و به کمک عبارت تازه ای به نام section@ مشخص کنیم که برای کدام بخش، چه درون مایه و تگ هایی را می خواهیم مشخص کنیم. در واقع اگر نیاز به چندین بخش هست، پس نیاز است تا با ()RenderSection برای هر بخش یک نام یکتا مشخص کنیم و سپس هر بخش را با عبارت {}section name@ درون فایل نما بیاوریم که name نام یکی هر کدام از بخش های لایه است. توجه کنید تگ های هر بخش میان آکولادهای باز و بسته {} پیش رو section name@ نوشته می شوند.