در معماری MVC کنترلر (Controllers) بخشی است که تصمیمگیریها و منطق نرمافزار در آن نوشته میشود و برای حرکت بین Model و View عمل میکنند در واقع کنترلرها واحدهای اصلی و مرکزی پروژه ASP.NET MVC هستند. کنترلرها اطلاعات را از سرور دریافت میکنند و درخواستهای HTTP Request ورودی را پردازش میکنند و تصمیم میگیرند در جهت اجرای درخواستهای HTTP کدام مدل یا مدلها انتخاب شوند تا اطلاعات را از مبدل دریافت کرده و آنها را به View انتقال میدهند. در نتیجه خروجی توسط View تولید شده به کاربر نمایش داده میشوند.
در دوره رایگان آموزش asp در فصل سوم معماری و فریم ورک mvc در asp.net core را آموزش داده ایم برای تسلط کامل بر این موضوع می توانید این فصل و دوره را مشاهده کنید.
در فریمورک MVC معمولاً Controllerها را در پوشهٔ Controllers قرار میدهند .
و اگر تعداد آنها زیاد باشد برای جلوگیری از سردرگمی و مدیریت بهتر فایلها میتوانیم در پوشهٔ Controllers پوشههای دیگر ایجاد کنیم و از آنها برای تقسیمبندی کنترلرها استفاده کنیم.
ساخت کنترلر جدید
برای ساختن Controller جدید روی پوشه ی Controllers راست کلیک و گزینه Add را میزنیم و در مرحله بعد گزینه ی Controller را انتخاب میکنیم .
در صفحهای که باز میشود 6 گزینه وجود دارد، سه گزینه بالایی به ما MVC Controllerهایی ارائه میدهد که برای برنامههای Asp.net mvc استفاده میشود و سه گزینه پایین Controllerهایی از جنس API به ما ارائه میدهد.
زمانی که شما یک برنامهٔ Web API مینویسید و هدف این است که به کاربران یک API(وبسرویس) ارائه دهید از سه گزینه پایین استفاده میکنید.
.
حالا تفاوت گزینهها را بررسی میکنیم.
گزینه اول: یک کنترلر خالی برای ما ایجاد میکند.
گزینه دوم: با استفاده از Scaffolding یک کنترلر برای ما ایجاد میکند و داخل این کنترلر چندین اکشن که موردنیاز عملیات کراد هستند قرار دارد. Scaffolding قسمتی در Visual studio ست که برای تولید خودکار کدها به کار برده میشود. یک سری کدها وجود دارند که همهجا تکراری هستند و تقریباً یکشکل دارند که با استفاده از اسکفلدینگ میتوان خودکار این کدها را تولید کرد.
گزینه سوم: اگر شما EF را روی پروژه نصبکرده و اتصال به دیتابیس را انجام داده باشید، با استفاده از این گزینه کنترلری ایجاد میشود که علاوه بر اکشنهای کراد، ویوهای مربوط به این اکشن هم برای ما ایجاد میکند و بدون نیاز به کدنویسی میتوان عملیات کراد را بر روی یکی از Entityها انجام داده و زمانی که پروژه اجرا میکنید و به این کنترلر مراجعه میکنید، میبینید که تمام عملیات کراد برای شما انجام میشود. دیتا از دیتابیس خوانده میشود، میتوان دیتا اضافه، ویرایش و یا حذف کرد.
سه گزینه پایین هم دقیقاً کار سه گزینه اول را برای API Controllerها انجام میدهند.
برای نمونه یک پروژهٔ mvc از نوع Empty انتخاب میکنیم و یک نام برای پروژه انتخاب میکنیم. قانون نامگذاری کنترلرها در فریمورک mvc به این شکل هست که بعد از نامی که برای کنترلر انتخاب کردیم باید کلمه Controller را به انتهای نام اضافه کنیم.
کنترلرهایی که به برنامه اضافه میکنیم در واقع کلاسهای سی شارپ هستند و با اضافهکردن کلمهٔ Controller به انتهای نام کنترلر فریمورک MVC تشخیص میدهد که آیا این یک کنترلر است یا نه البته راههای دیگر هم برای تشخیص کنترلرها وجود دارد که در ادامه بررسی میکنیم.
کنترلرها دارای اکشن هستند در واقع کنترلر کلاسی است که به درخواست کاربران رسیدگی میکند و هر کنترلر به تعداد نامحدودی اکشن تقسیم میشود و کاربران درخواستهای خود را به این اکشنها ارسال میکنند .
حالا یک کنترلر جدید به نام blogController ایجاد میکنیم داخل این کنترلر اکشنی به نام Index وجود دارد (این اکشنها دقیقاً متدهای سی شارپ هستند). مقدار برگشتی این متد متنی است که درون این اکشن نوشته شده و از نوع string است.
حالا وقتی برنامه رو اجرا کنیم و به این اکشن و کنترلر درخواست بدیم، رشته باید در خروجی نمایش داده شود.
برنامه بهصورت پیشفرض یک کنترلر و یک اکشن دارد که یک ویو هم دارد وقتی پروژه اجرا میشود با استفاده از تنظیمات مسیریابی که در ادامه آموزش میدهیم صفحهٔ پیشفرض ما میشود home و Index که در ادامه باهم بررسی میکنیم.
حالا ما کنترلری به اسم BlogController و درون آن اکشنی به نام Index ساختیم، حالا میخواهیم به اکشن Index درخواست بدهیم. سیستم مسیریابی در Asp.net core به این صورت است که بعد از نام دامنهٔ وبسایت باید نام کنترلر وارد شود و بعد از آن نام اکشن . (مطابق شکل زیر)
وقتی درخواست رو به اکشن ارسال میکنیم دقیقاً متنی که در اکشن Return کرده بودیم در خروجی میبینیم، پس به این صورت میتوان درخواستی به اکشن ارسال و پاسخ دریافت کرد.
راههای تشخیص یک کنترلر
در فریمورک MVC از سه طریق میتوان تشخیص داد یک کلاس از نوع کنترلر هست یا خیر
روش اول: کلاس از کلاس Controller ارثبری کرده باشد.
کلاسهایی که کنترلر باشند، بیرون از پروژه و سرور همهٔ افراد میتوانند به متدهای پابلیک این کلاس Request ارسال کنند، پس اگر کلاسی داشته باشید و نخواهید که بیرون از پروژه توسط افراد به این کلاس درخواست داده شود و ناخواسته این کلاس را به کنترلر تبدیل کنید خیلی راحت کل اطلاعات را در اختیار عموم قرار دادهاید. پس خیلی مهم است که کلاسهای خصوصی به کنترلر تبدیل نشود و هرکجای پروژه
(داخل پوشهٔ Controllers یا هر پوشه دیگر) کلاسی از Controller ارثبری کند این کلاس یک کنترلر محسوب میشود.
روش دوم: ختم شدن نام کنترلر با کلمهٔ Controller
یک کلاس جدید به اسم News Controller ایجاد میکنیم که یک اکشن به نام Index و از نوع String دارد و اینجا از کلاس Controller ارثبری نشده . (مطابق شکل زیر)
حالا اجرا میکنیم و به آن درخواست میدهیم (شکل زیر) ، مبینیم که بهراحتی دادهها رو دریافت شد.
روش سوم: استفاده از Controller Attribute
یک کلاس ساده سی شارپ میسازیم به اسم product و داخلش متدی به اسم Getdata از نوع رشته تعریف میکنیم.
حالا اگر به این متد و اکشن درخواست ارسال کنیم با خطای 404 مواجه میشویم، یعنی این مسیر روی سرور پیدا نشد .
حالا اگر این کلاس را تبدیل به کنترلر کنیم و اجرا کنیم اطلاعات بهراحتی قابلدسترسی هستند. برای تبدیل این کلاس به کنترلر باید عبارت Controller را قبل از تعریف متد بنویسیم (مطابق شکل زیر)
شاید شما دچار این اشتباه نشوید که برای یک کلاس سی شارپ اتریبیوت Controller تعریف کنید یا برای کلاسی که کنترلر نیست از Controller ارثبری کنید ولی اگر یک کلاس ساده که از نوع کنترلر نیست را در انتهای نامش عبارت Controller رو اضافه کنید این کلاس را تبدیل به یک کنترلر کردهاید.
فرض کنید در یک پروژه برای کنترل دادههایی که کاربر وارد میکند میخواهید عملیات Validation انجام دهید، برای این کار کلاسی به اسم UserDataController تعریف میکنید. این کلاس داخل پوشة Controller نیست ولی در واقع یک کنترلر محسوب میشود و خارج از پروژه میتوان به دیتای این کلاس دسترسی پیدا کرد. حالا برای اینکه این کلاس از نوع Controller نباشد و اسم کلاس هم UserDataController باشد باید چه کاری انجام دهیم؟
در اینجا فریم ورک mvc یک اتریبیوت به نام Non Controller در اختیار ما قرار میدهد که با استفاده از آن میتوان کلاس را از حالت Controller خارج کرد. با این روش دیگر دادههای این کلاس خارج از پروژه در دسترس نیست.
برای افزودن دیدگاه خود، نیاز است ابتدا وارد حساب کاربریتان شوید