آموزش کار با کنترلر (Controller) در ASP.Net MVC
کنترلرها (Controllers) واحدهای اصلی و مرکزی پروژه ASP.NET MVC هستند. کنترلرها، اولین دریافت کننده اطلاعات در سرور بوده و درخواست های HTTP Request ورودی را پردازش می کنند.
کنترلرها تصمیم می گیرند در جهت اجرای درخواست های HTTP، کدام مدل (Model) یا مدل ها انتخاب شوند تا اطلاعات را از مبدل دریافت کرده و آن ها را به نما (View) پاس می دهند. سپس خروجی توسط نما (View) ها تولید شده و به کاربر نمایش داده می شوند.
نتیجه : کنترلرها درواقع چرخه کلی پروژه MVC را مدیریت کرده و با دریافت ورودی ها و اطلاعات، به تولید خروجی نهایی کمک می کنند.
کنترلرها (Controllers)، کلاس های C# ای هستند که از رفرنس System.Web.Mvc.Controller مشتق شده و Controller کلاس پایه، تمامی آن هاست. هر کنترلر می تواند یک یا چندین متد اجرایی عمومی (public Action Method) داشته باشد که می توان آن ها را از هر کجای وب و به کمک URL متناسب، فراخوانی و اجرا کرد.
نکته کاربردی : طبق قواعد پیش فرض MVC، نام هر کنترلر بایستی با کلمه کلیدی Controller پایان یافته و درون پوشه Controllers پروژه قرار گیرند. ویژوال استودیو در هنگام ایجاد یک پروژه جدید MVC، پوشه Controllers را به صورت پیش فرض می کند.
مثال عملی ایجاد یک کنترلر در پروژه ASP.NET MVC :
برای درک بهتر کار با کنترلر، بیایید در یک مثال عملی یک کنترلر را به پروژه اضافه کرده و آن را اجرا نماییم. برای این منظور مراحل زیر را طی کنید :
مرحله 1 : ویژوال استودیو را باز کرده و از طریق مسیر File->New->Project کادر زیر را جهت ایجاد یک پروژه جدید MVC باز کنید :
مرحله 2 : از پنل سمت چپ، گزینه های Templates->Visual C#->web را به ترتیب انتخاب کنید.
مرحله 3 : در کادر وسط، گزینه ASP.NET Web Application را برای ایجاد یک پروژه جدید MVC، انتخاب کنید.
مرحله 4 : همانند تصویر زیر، در بخش Name یک نام برای پروژه تعیین کرده و محل قرارگیری فایل های آن را مشخص نمایید. سپس دکمه ok را بزنید.
مرحله 5 : سپس کادر زیر باز می شود که می توانید نوع تمپلیت یا ساختار اولیه پروژه را انتخاب نمایید.
برای اینکه کار راحت تر بوده و با برنامه کار کنیم، گزینه Empty را انتخاب کنید که یک پروژه خالی ایجاد می کند. توجه داشته باشید، علامت کادر MVC را تیک بزنید، تا حداقل فایل و رفرنس های لازم جهت پروژه های MVC به سایت اضافه شوند. سپس دکمه ok را بزنید.
مرحله 6 : پس از ایجاد پروژه جدید توسط ویژوال استودیو، می بینید که کلیه ی فایل و پوشه پیش فرض و اولیه سایت های ASP.Net MVC ایجاد شده و در منوی Solution Explorer قابل مشاهده هستند.
از آنجایی که یک پروژه خالی MVC ایجاد کردیم، در حال حاضر برنامه هیچ چیزی برای اجرا و تولید خروجی ندارد.
برای اضافه کردن یک کنترلر دلخواه به نام EmployeeController ، بر روی پوشه Controller در منوی Solution Explorer کلیک راست کرده و گزینه Add و سپس Controller را بزنید :
پنجره Scaffold جهت تعیین نوع Controller به صورت زیر باز می شود :
در پنجره فوق، گزینه MVC 5 Controller-Empty را جهت ایجاد یک کنترلر خالی انتخاب کرده و دکمه Add را بزنید. پنجره زیر جهت تعیین نام کنترلر باز خواهد شد :
مرحله 8 : نام کنترلر را EmployeeController تعیین کرده و دکمه ok را بزنید. ویژوال استودیو یک فایل C# به نام EmployeeController.cs در پوشه Controllers ایجاد کرده و آن را جهت ویرایش، به صورت زیر برایتان باز می کند :
حال برای ایجاد امکان فراخوانی کنترلر Employee، یک مسیر (Route) جدید در فایل مسیردهی پروژه (RouteConfig.cs) ایجاد می کنیم :
مرحله 1 : به فایل RouteConfig.cs در پوشه App_Start رفته و یک مسیر جدید با کد زیر تعیین کنید :
| syntax |
| کد |
routes.MapRoute(
"Employee", "Employee/{name}", new{
controller = "Employee", action = "Search", name =
UrlParameter.Optional });
|
توضیح مسیر جدید :
- نام مسیر (Route) فوق، “Employee” است.
- این مسیر، کنترلر Employee را فراخوانی کرده و می تواند پارامتر اختیاری {name} را به عنوان ورودی دریافت کند.
- متد پیش فرض این کنترلر در بخش new، متد Action تعیین شده است.
در نهایت، کد فایل RouteConfig.cs به صورت زیر تغییر خواهد کرد :
| syntax |
| کد |
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace MVCControllerDemo {
public class RouteConfig {
public static void RegisterRoutes(RouteCollection routes){
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Employee", "Employee/{name}", new{
controller = "Employee", action = "Search", name = UrlParameter.Optional });
routes.MapRoute(
name: "Default", url: "{controller}/{action}/{id}", defaults: new{
controller = "Home", action = "Index", id = UrlParameter.Optional });
}
}
}
|
حال موقعیتی را در نظر بگیرید که کاربر وارد شده و با وارد کردن آدرس “Employee/Mark” به دنبال اطلاعات Mark می گردد. در این حالت، طبق مسیر یا Route ای که تنظیم کرده ایم، Mark به عنوان پارامتر {name} در نظر گرفته شده و به متد اجرایی کنترلر Employee ارسال می شود. اما به دلیل اینکه در متد Search، کد مناسب جهت دریافت اطلاعات پارامتر ارسالی را تعیین نکرده ایم، مثال به درستی کار نخواهد کرد.
برای دریافت صحیح مقدار پارامتر (Value) از آدرس مرورگر، بایستی برای متد Search یک پارامتر متنی تعیین کنیم. لذا کد متد را به صورت زیر تغییر دهید :
| syntax |
| کد |
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MVCControllerDemo.Controllers {
public class EmployeeController : Controller {
// GET: Employee
public ActionResult Search(string name){
var input = Server.HtmlEncode(name);
return Content(input);
}
}
}
|
نکته کاربردی :
اگر برای یک متد اجرایی، پارامتری یا پارامترهایی تعیین کنید، MVC به صورت خودکار به دنبال مقادیر (Value) هایی می گردد که متناسب با نام و نوع آنهاست.
MVC در متن آدرس (URL)، پارامترهای query string آدرس، دیتاهای ارسالی به کنترلر و ... برای یافتن مقادیر متناظر با پارامترها، جستجو خواهد کرد.
بنابراین اگر آدرس ‘Employee/Mark” را درخواست کنید، MVC متوجه می شود مقدار Mark جهت پارامتر (string name) متد Search بوده و به صورت اتوماتیک مقدارش را به متد پاس می دهد.
راهنمایی :
متد Server.HtmlEncode، تمامی مقادیر ورودی پارامترها را به متن خالص تبدیل می کند. این کار از حملات اسکریپتی جلوگیری می کند.
در پایان، هنگامی که آدرس +آدرس، در مرورگر وارد شده و توسط MVC پردازش و ایمن سازی می شود، باعث تولید خروجی زیر در صفحه خواهد شد :
همانطور که در تصویر فوق دید، مقدار Mark از درون URL استخراج و به صفحه پاس داده شد.