کنترل گر (Controller) بخشی از مدل MVC هستند که منطق برنامه را پیاده سازی می کنند. کنترل گر ها، کلاس هایی در برنامه هستند که از کلاس پایه ای به نام Controller ارث بری می کنند. همه فایل های کلاس های کنترل گر در زیر پوشه Controllers از پوشه پروژه ساخته و نگهداری می شوند. به طور کلی هر برنامه ASP.NET Core MVC در کنار دیگر مولفه ها، دارای سه مولفه زیر است:

  • Controller
  • Action یا Action Method
  • Action Result

کنترل گر پیش فرض

در پروژه های ASP.NET Core MVC 3 یک کلاس کنترل گر به نام HomeController در پوشه Controllers هست که دارای دو Action Method زیر به نام های ()Index و ()Privacy است. بنابراین بر پایه نام کلاس کنترل گر و نام متدهای آن، دو الگو مسیر (Route) به گونه Home/Index/ و Home/Privacy/ داریم. بنابراین نشانی های URL زیر در برنامه شناخته شده هستند.

بنابراین در نشانی های URL بالا Home به کلاس کنترل گر HomeController اشاره دارد. توجه کنید که نام کلاس های کنترل گر با واژه Controller پایان می یابند مانند UserController یا LoginControoler یا هر نام دیگری و همگی باید از کلاس پایه Controller به ارث برده شوند. این کلاس پایه در فضای نام Microsoft.AspNetCore.Mvc نوشته شده است. کد زیر کلاس کنترلگر پیش فرض HomeController را نشان می دهد.

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

Action یا Action Method چیست

در نوشته مفهوم مسیرها در ASP.NET Core MVC گفتیم که یک درخواست با نشانی URL به سرور فرستاده می شود و سپس این مسیر به یک الگو مسیر (Route) نگاشت داده می شود. الگوی پیش فرض مسیرها به ریخت Controller/Action/Id/ است که در آن Id اختیاری است. بنابراین تلاش می شود تا نشانی URL به یک الگو تطابق داده شود که برآیند (نتیجه) آن پیدا شدن کلاس کنترل گر و سپس فراخوانی و انجام شدن یک Action یا Action Method است. بنابراین هر کلاس کنترل گر دارای یک سری متد است که این متدها را Action Method می گوییم و هر Action Method نیز یک واکنش در برابر یک درخواست ورودی است.

در کد زیر دو Action Method از کد بالا نشان داده شده اند. Action ها متدهایی هستند که در قبال یک الگو مسیر فراخوانی می شوند. به عبارت بهتر، نخست یک URL به یک مسیر نگاشت داده شده و سپس بر پایه مسیر تطابق داده شده، یک کلاس کنترل گر و سپس یکی از متدهای آن فراخوانی می شوند. بنابراین اگر نشانی https://localhost:5001/home/privacy فرستاده شود، پس مطابق با الگوی Home/Privacy/ و از این رو متد ()Privacy از کلاس HomeController فراخوانی خواهد شد. همچنین اگر یکی از سه نشانی URL بالا فراخوانی شوند، پس متد ()Index از HomeController فراخوانی می شد.

هر دو Action Method گونه IActionResult را برگشت می دهند. در واقع همه Action Method ها باید یک Action Result مانند View یا JSON را برگشت دهند. در متدهای بالا ()View یک متد از کلاس ViewResult است که خود این کلاس یکی از Action Result ها است. بنابراین هر دو متد، یک View را برگشت می دهند.

متد ()View چیست و چگونه کار می کند

در نوشته های پیشین گفتیم که در پروژه یک پوشه به نام Views است که همه فایل های نما با پسوند chtml در آن نگهداری می شوند. همچنین گفتیم که این پوشه می تواند دارای زیر پوشه هایی باشد که ین زیر پوشه ها هم نام با کنترل گرها هستند. برای نمونه در شکل زیر زیر پوشه Home در Views همه فایل های نمای کنترل گر HomeController را نگه می دارد.

همانگونه که می بینید در مسیر Views/Home دو فایل نما و هم نام با نام متدهای Action در کلاس HomeController هست. بنابراین طبق قاعده اگر بخواهیم در قبال برآیند (نتیجه) Action Method یک فایل نما با پسوند chtml برگشت داده شود:

  • این فایل نما باید همنام با نام Action Method باشد.
  • این فایل نما باید در زیر پوشه ای همنام با نام کنترل گر در زیر پوشه Views ها باشد که در اینجا Home برای HomeController است.
  • البته می توان فایل نما با نامی متفاوت از متد Action Result داشت.
  • در حالت پیش فرض متد ()View هیچ ورودی دریافت نمی کند و این یعنی، فایل نما همنام با Action Method است ولی اگر می خواهید فایل نمایی با نام متفاوت را به کمک ()View برگشت دهید، پس حتما باید نام آن را نیز به ()View بفرستید.
  • همچنین زیر پوشه همنام با کنترل گر مانند پوشه Home در Views می تواند دارای زیر پوشه مثلا Items باشد. حال اگر فرض کنیم یک فایل نما به نام list_of_items.chtml در مسیر Views/Home/Items باشد، پس اگر بخواهیم فایل نما را درون متد ()View فراخوانی کنیم باید رشته items.list_of_items ها را به متد ()View بفرستیم. توجه کنید خود ()View می فهمد که Action Method فوق برای نمونه در کلاس HomeController است و از این رو خودکار پوشه Views/Home ا در نظر دارد و شما با فرستادن items.list_of_items می گویید که نخست به زیر پوشه Items رفته و سپس فایل نما به نام list_of_items.chtml را فراخوانی کند.

اکنون گمان کنید که می خواهید همیشه آشکارا نام فایل نما را به متد ()View بفرستید، پس همانند کدهای زیر، تنها و تنها نام فایل و بدون پسوند به متد فرستاده شود. توجه کنید که فایل های نما تنها یکی از Action Result ها هستند و شما می توانید برای نمونه فرمت JSON را در برآیند (نتیجه) Action Method برگشت دهید.