پیش از آنکه وارد آموزش های برنامه نویسی وب با فریم ورک ASP.NET Core شویم می بایست یک سری از پیش نیازها گفته شود. یکی از این پیش نیازها، توضیح مدل MVC یا Model-View-Control است که در این دوره ما بر پایه همین مدل، پروژه های ASP.NET Core MVC را آموزش می دهیم. 

مدل MVC چیست

MVC یکی از چندین الگو (Pattern) طراحی برنامه های نرم افزاری است که تنها در طراحی برنامه های وب کاربرد ندارد و می توان آن را ساخت برنامه های گوناگون با زبان ها و فریم ورک های گوناگون به کار برد. ایده اصلی این مدل جدا سازی سه لایه اصلی برنامه از یکدیگر است که این لایه ها عبارتند از نما، کنترل گر و مدل که در ادامه هر یک از آنها آموزش داده شده اند.

لایه مدل

لایه مدل (Model Layer) مسئول ارائه داده ها است. هر دسترسی، تغییر،درج و بروزرسانی در داده ها، از طریق لایه مدل انجام می شود. معمولا این لایه به گونه یک پایگاه داده رابطه ای مانند SQL Server یا MySQL است ولی می تواند هر منبع داده ای دیگر همانند پایگاه داده های غیر رابطه ای NoSQL نیز باشد. لایه مدل از منطق برنامه و چگونگی کارکرد برنامه آگاهی ندارد بلکه تنها می داند چگونه به داده ها دسترسی داشته باشد. این لایه می تواند یک تک شی (مانند یک جدول پایگاه داده رابطه ای) یا یک مجموعه پیچیده از اشیا مرتبط به یکدیگر (مانند رابطه میان جدول های پایگاه داده رابطه ای) باشد.

لایه نما

لایه نما (View Layer) واسط کاربری را پیاده سازی می کند و وظیفه آن دریافت ورودی ها (مانند فرم های اچ تی ام ال) و سپس فرستادن آنها به یک کنترل گر و پس از آماده سازی پاسخ، نمایش پاسخ مانند یک خطا یا یک پیغام و یا یک سری از سطرهای جدول در خروجی برای کاربر است. پس بخشی از یک برنامه ASP.NET Core MVC که به کاربر نمایش داده می شود و کاربر با آن با برنامه تعامل دارد،لایه نما است که می تواند تنها دربرگیرنده کدهای HTML و CSS یا پیچیده تر، ترکیبی از فریم ورک های جاوا اسکریپت مانند React یا Angular همراه اچ تی ام ال و سی اس اس باشد.

در نوشته های پیش رو درباره مولفه Razor برای ساخت فایل های نما در ASP.NET Core MVC گفته شده است.

لایه کنترل گر

لایه کنترل گر (Controller Layer) منطق برنامه را پیاده سازی می کند. به گفته بهتر، این لایه، لایه ای میان دو لایه نما و مدل است به گونه ای که درخواست های فرستاده شده به برنامه وب ASP.NET Core از نما به یک کنترل گر فرستاده شده و سپس می تواند خود کنترل گر یک سری تغییرها را روی آن انجام دهد و یا اینکه یک سره درخواست را به یک مدل بفرستد تا داده های دلخواه بدست آمده و سپس بازهم شاید یک سری تغییرات و پردازش ها روی آنها انجام دهد و در پایان نتیجه برای نمایش به لایه نما فرستاده شود. پس لایه کنترل گر در کنار اینکه منطق برنامه را پیاده سازی می کند، میانجی میان لایه نما و مدل است.

شکل زیر ساختار مدل MVC را نشان می دهد و همانگونه که می بینید لایه کنترل گر لایه میانجی میان لایه های نما و مدل هست. کاربر با باز کردن برگه یک وب سایت همانند فرن ثبت نام، به یک لایه نما دسترسی پیدا می کند. سپس یک درخواست که دربرگیرنده داده های ثبت نام است را به یک کنترل گر می فرستد و سپس کنترل گر شاید یک سری از پردازش ها را روی آن انجام  دهد و شاید هم نه. سپس این داده ها به لایه مدل فرستاده می شود که در عمومی ترین حالت، یک پایگاه داده رابطه از چندین جدول است. داده توسط مدل بر روی جدول(ها) نوشته می شوند و سپس یک پاسخ باید از لایه مدل به کنترل گر فرستاده شود و در پایان کنترل گر نتیجه را به لایه نما می فرستد تا کار از نتیجه آگاه شود.

سودهای مدل MVC

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

در MVC می توان چندین نما باشند که همگی تنها با یک مدل در ارتباط باشند. اکنون گمان کنید که MVC نباشد و شما باید هربار درون فایل نما که دربرگیرنده کدهای اچ تی ام ال و دیگر است را همراه پرس و جوهای پایگاه داده در کنار هم بنویسید و در کنار این دو منطق برنامه را نیز به آنها بی افزایید. با MVC شما می توانید یک نما را برای هر یک از چهار کارکرد CRUD (کوتاه شده Create-Read-Update-Delete) بنویسید که همگی با یک مدل در ارتباط هستند.

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

پیاده سازی لایه ها

برای به کار گیری معماری MVC درون ASP.NET Core MVC باید از شی گرایی کمک بگیریم بدین گونه که مدل ها که منبع داده مانند پایگاه رابطه ای را توصیف می کنند و یا کنترل گرها که منطق و پیوند میان لایه نما و مدل را پیاده سازی می کنند باید به گونه کلاس های زبان برنامه نویسی مانند سی شارپ در پروژه شناسانده شوند. بنابراین هم مدل ها و هم کنترل گر ها کلاس هایی از زبان برنامه نویسی هستند.

در پروژه های ASP.NET Core MVC سه پوشه (Folder) به نام های Models و Controllers و Views هستند که به ترتیب فایل های مربوط به کلاس های مدل و کنترل گر و فایل های مربوط به نماها را در خود نگه می دارند. در واقع اینها محلی پیش فرض برای جدا سازی هر یک از فایل های لایه های مدل MVC هستند.

فایل های مدل و کنترل گر دارای پسوند cs هستند زیرا می خواهیم در آنها کلاس ها را بنویسیم ولی فایل های نما ترکیبی از کدهای سی شارپ و کدهای اچ تی ام ال هستند و از این رو پسوند آنها chtml خواهد بود. این فایل ها در پوشه Views و زیر پوشه ها آن نگهداری می شوند. در نوشته های پیش رو بیشتر درباره ساختار پروژه ASP.NET Core MVC گفته می شود و خواهید دید که پوشه هایی برای نگهداری جداگانه فایل های سی اس اس و جاوا اسکریپت فراهم شده است.