در معماری MVC، کنترلگر (Controller) بخشی از برنامه است که واسط بین مدل و نما است. کنترلگر درخواستهای کاربر را دریافت میکند، با مدل ارتباط برقرار میکند تا دادههای مورد نیاز را دریافت کند و سپس دادهها را به نما ارسال میکند تا به کاربر نمایش داده شود.
وظایف اصلی کنترلگر (Controller)
1- دریافت درخواستها: کنترلگر درخواستهای HTTP را از کاربر دریافت میکند. این درخواستها میتوانند شامل درخواستهای GET، POST، PUT و DELETE باشند.
2- پردازش دادهها: کنترلگر با مدل ارتباط برقرار میکند تا دادههای مورد نیاز را دریافت یا بهروزرسانی کند. این شامل اجرای بیزینس لاجیک و اعتبارسنجی دادهها نیز میشود.
3- ارسال پاسخها: پس از پردازش دادهها، کنترلگر دادهها را به نما ارسال میکند تا به کاربر نمایش داده شوند. این میتواند شامل رندر کردن یک صفحه HTML یا ارسال دادههای JSON برای یک API باشد.
مثالفرض کنید یک برنامه مدیریت کتابخانه دارید. وقتی کاربر درخواست مشاهده لیست کتابها را ارسال میکند، کنترلگر این درخواست را دریافت میکند، با مدل ارتباط برقرار میکند تا لیست کتابها را دریافت کند و سپس این دادهها را به نما ارسال میکند تا به کاربر نمایش داده شود.
public class BooksController : Controller
{
private readonly IBookRepository _bookRepository;
public BooksController(IBookRepository bookRepository)
{
_bookRepository = bookRepository;
}
public IActionResult Index()
{
var books = _bookRepository.GetAllBooks();
return View(books);
}
}
در این مثال، کنترلگر BooksController درخواستهای مربوط به کتابها را مدیریت میکند. متد Index لیست کتابها را از مخزن دادهها (Repository) دریافت میکند و آنها را به نما ارسال میکند تا به کاربر نمایش داده شوند.
در ASP.NET Core MVC امکانات متعددی دارد که هر کدام نقش مهمی در توسعه وب اپلیکیشنها ایفا میکنند. در ادامه به توضیح هر یک از این امکانات میپردازم:
1- Routing:
- توضیح: Routing به شما اجازه میدهد که URLها را به اکشنهای کنترلرها نگاشت کنید. این امکان به شما کمک میکند تا URLهای خوانا و قابل فهم برای کاربران و موتورهای جستجو ایجاد کنید.
2- Model Binding:
- توضیح: Model Binding دادههای ورودی از درخواستهای HTTP (مانند فرمها) را به پارامترهای اکشنها و مدلها نگاشت میکند. این فرآیند به شما کمک میکند تا دادهها را به راحتی دریافت و پردازش کنید.
3- Model Validation:
- توضیح: Model Validation به شما اجازه میدهد تا قوانین اعتبارسنجی را برای مدلها تعریف کنید و اطمینان حاصل کنید که دادههای ورودی معتبر هستند. این اعتبارسنجیها میتوانند به صورت اتوماتیک در فرمها اعمال شوند.
4- Dependency Injection:
- توضیح: Dependency Injection (DI) یک الگوی طراحی است که به شما اجازه میدهد وابستگیها را به صورت پویا تزریق کنید. ASP.NET Core به صورت داخلی از DI پشتیبانی میکند که به شما کمک میکند کدهای قابل تست و قابل نگهداری بنویسید.
5- Filters:
- توضیح: Filters به شما اجازه میدهند تا منطقهای مشترک را قبل یا بعد از اجرای اکشنها اعمال کنید. انواع مختلفی از فیلترها وجود دارند مانند Authorization، Action، و Exception filters.
6- Areas:
- توضیح: Areas به شما کمک میکنند تا اپلیکیشنهای بزرگ را به بخشهای کوچکتر و قابل مدیریت تقسیم کنید. هر Area میتواند کنترلرها، ویوها و مدلهای خود را داشته باشد.
7- Web API:
- توضیح: ASP.NET Core MVC به شما اجازه میدهد تا APIهای RESTful ایجاد کنید که میتوانند توسط کلاینتهای مختلف (مانند مرورگرها و موبایلها) مصرف شوند.
8- Testability:
- توضیح: ASP.NET Core MVC به گونهای طراحی شده است که تست کردن کدها آسان باشد. استفاده از DI و جداسازی منطقها به شما کمک میکند تا تستهای واحد و یکپارچه بنویسید.
9- Razor View Engine:
- توضیح: Razor یک موتور ویو است که به شما اجازه میدهد کدهای C# را درون HTML بنویسید. این موتور ویو به شما کمک میکند تا ویوهای پویا و قابل نگهداری ایجاد کنید.
10- Strongly Typed Views:
- توضیح: Strongly Typed Views به شما اجازه میدهند تا ویوها را به مدلهای خاصی متصل کنید. این امکان به شما کمک میکند تا از تایپهای قوی و IntelliSense در ویوها استفاده کنید.
11- Tag Helpers:
- توضیح: Tag Helpers به شما اجازه میدهند تا کدهای HTML را با استفاده از کدهای C# غنیسازی کنید. این امکان به شما کمک میکند تا کدهای HTML تمیزتر و قابل نگهداریتری بنویسید.
12- View Components:
- توضیح: View Components به شما اجازه میدهند تا بخشهای قابل استفاده مجدد از UI را ایجاد کنید. این بخشها میتوانند منطقهای پیچیدهای داشته باشند و در ویوهای مختلف استفاده شوند.
این امکانات تنها بخشی از ویژگیهای ASP.NET Core MVC هستند. این فریمورک همچنین از ویژگیهای دیگری مانند پشتیبانی از چند پلتفرم، پشتیبانی از میکروسرویسها و پشتیبانی از کانتینرها نیز برخوردار است.
Overview of ASP.NET Core MVC | Microsoft Learn
https://learn.microsoft.com/en-us/aspnet/core/mvc/overview?view=aspnetcore-8.0
برای ایجاد کنترل پوشه Controllers راست کلیک کنید و در قسمت Add گزینه Controllers انتخاب کنید
سه گزینه دارد
1-کنترلر MVC خالی (Empty MVC Controller):
این نوع کنترلر، یک کنترلر خالی بدون هیچگونه اکشنهای پیشفرض یا ویوها است. معمولاً برای زمانی که نیاز به ایجاد یک کنترلر سفارشی با اکشنها و ویوهای خاص دارید، استفاده میشود.
2-کنترلر MVC با اکشنهای خواندن/نوشتن (MVC Controller with Read/Write Actions):
این نوع کنترلر شامل اکشنهای استاندارد برای عملیات CRUD (ایجاد، خواندن، بروز رسانی، حذف) است. این اکشنها به شما اجازه میدهند تا به صورت پیشفرض با دادهها کار کنید و آنها را در نمایههای مختلف نمایش دهید یا تغییر دهید.
3-کنترلر MVC با ویو، استفاده از Entity Framework (MVC Controller with View, using Entity Framework):
این نوع کنترلر از Entity Framework برای مدیریت دادهها استفاده میکند و به صورت خودکار ویوهایی برای عملیات CRUD ایجاد میکند. این نوع کنترلر به شما اجازه میدهد تا به راحتی با پایگاه داده ارتباط برقرار کنید و دادهها را در ویوها نمایش دهید یا ویرایش کنید.
یک کنترل جدید می سازیم به نام BlogController
کنترل یک کلاسی هست که به درخواست کاربران رسیدگی می کند هر کنترلی به تعداد نامحدود Action داشته باشد که کاربران درخواست های خودشون به Action ها ارسال می کند
در Asp.Net Core MVC، یک Action متدی در کنترلر است که به درخواست HTTP پاسخ میدهد. هر Action در کنترلر برای پردازش و پاسخ به یک نوع خاص از درخواست HTTP، مثل GET، POST، PUT، DELETE و غیره، طراحی شده است. برای مثال:
public class HomeController : Controller
{
// این اکشن به درخواستهای GET پاسخ میدهد
public IActionResult Index()
{
return View();
}
// این اکشن به درخواستهای POST پاسخ میدهد
[HttpPost]
public IActionResult Create(Item item)
{
// منطق ایجاد آیتم جدید
return RedirectToAction("Index");
}
}
در این مثال، اکشن Index به درخواستهای GET پاسخ میدهد و اکشن Create به درخواستهای POST پاسخ میدهد. هر اکشن میتواند دادهها را پردازش کند، منطق خاصی را اجرا کند و در نهایت یک پاسخ (مثلاً یک ویو) به مرورگر ارسال کند
یک مثال: Action را به string تغییر می دهم و در خروجی یک متنی را تایپ کنم که وقتی کنترل و این Action را صدا زدم در خروجی ای متن به من برگشت بده
using Microsoft.AspNetCore.Mvc;
namespace ASP.NETCorMVC.Controllers
{
public class BlogController : Controller
{
public string Index()
{
return "سلام خوش آمدید به ASP.Net";
}
}
}
برنامه اجرا شد و به صورت پیشفرض یک کنترل و یک اکشن Action ساخته شده بود که یک Views داشته
در مسیر دهی بعد از دامنه باید نام کنترل را وارد کنید و بعد از نام کنترل نام اکشن را وارد کنید
که می شود :
https://localhost:44355/blog/index
در Asp.Net Core MVC، از سه طریق می تواند تشخیص دهد که کلاس آیا کنترل هست یا نه
1- از کلاس Controller ارث بری کرده باشد
2- نام کلاس را با نام Controller ختم بشود مثلا
BlogController
3- از attribute استفاده کنیم
[Controller]
کلاس هایی که کنترل باشند از بیرون پروژه و بیرون از سرور همه افراد می توانند به متد public درخواست request ارسال کند
اگر در پروژه کلاس داشته باشید که هدف این نباشد که کنترل باشد که توسط افراد از بیرون درخواست داده بشود و ناخواسته به کنترل تبدیل کنید خیلی راحت اطلاعت در دسترس عموم قرار داده اید و هر کسی آدرس این را داشته باشد که به راحتی پیدا می کنند می تواند به این درخواست بده و برنامه را با مشکل مواجه کند
حالا شاید نیاز بود یک کاری را می خواهید انجام بدهید حتما نام کلاس با انتهای کنترل هم داشته باشد که می توانید از attribute [NonController] استفاده کنید