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

Conventional Routing

زمانی که یک پروژه ASP.NET Core MVC را می سازید، برنامه یک قاعده پیش فرض مسیریابی (Routing) را درون متد ()Configure از کلاس Startup می سازد. اگر فرض کنیم که شما پروژه ASP.NET Core 2.x را ساخته باشید، نخستین کد زیر بخشی از درون متد ()Configure را نشان می دهد ولی اگر ASP.NET Core 3.x را به کار برده باشید، دومین کد زیر بخشی از درون متد ()Configure را نشان می دهد. بنابراین Convention Routing اجازه می دهد تا یک الگو (Format) یا گروهی از الگوهایی را بنویسیم که از آنها برای اداره کردن و پردازش درخواست های ورودی از نشانی URL ها کمک بگیریم. 

توجه کنید به ترتیب ()UseEndpoints و ()MapControllerRoute در نسخه ۳ جایگزین ()UseMvc و ()MapRoute در نسخه ۲ شده اند. با داشتن الگوی زیر، برای نمونه نشانی Products/Details/5/ تطبیق داده می شود و از روی این نشانی مقدارهای controller = Products, action = Details, id = 5 بدست می آیند و از این رو متد ()Details از کلاس ProductController با مقدار ورودی ۵ فراخوانی می شود.

داشتن چندین مسیر

می توانیم درون ()UseMvc در نسخه ۲ یا در ()UseEndpoints در نسخه ۳ چندین الگوی مسیر داشته باشیم که این کار با فراخوانی چندین باره ()MapRoute در نسخه ۲ (درون UseMvc) و یا فراخوانی ()MapControllerRoutes در نسخه ۳ (درون UseEndpoints) انجام می شود. بنابراین با این ویژگی می توانید چندین الگو داشته باشید که در برابر عملیاتی ویژه را انجام دهند.

در کد زیر یک الگوی مسیر تازه به نام blog نوشته ایم که از گونه اختصاصی (Dedicated Conventional Route) است، بدین معنی که این الگو مسیر Conventional Route است ولی ویژه یک متد Action از یک کلاس کنترل گر ویژه است که در اینجام نام متد Article و نام کلاس کنترل گر BlogController است.

Attribute Routing

شیوه Attribute Routing با کمک از برخی از ویژگی ها، نگاشت متدهای Action به الگوهای مسیر را سر راست انجام می دهد. به گفته دیگر با افزودن این ویژگی در بالا نام متد Action در کلاس کنترل گر، نگاشت به الگوهای مسیر جدا از الگو نوشته شده در کلاس Startup انجام می شود.

در کد زیر دو تابع ()Index و ()Privacy داریم که به کمک دستور ()Route برای هر یک مسیرهایی را پیش از نام آنها سر راست نوشته ایم. درباره متد ()Index سه مسیر با مفهومی یکسان را نوشته ایم که همگی به برگه خانگی اشاره دارند. زمانی که یک رشته تهی (“”)Route را نوشتیم این همسان با https://mydomain.com است. زمانی که مسیرهای (“Route(“Home و (“Route(“Home/Index را نوشتیم، این دو به ترتیب به نشانی های https://mydomain.com/home و https://mydomain.com/home/index اشاره دارند.

نادیده گرفتن نام متد Action با Attribute Routing

در الگوی {Controller/Action/{Id همانگونه که می بینید نام کنترل گر و متد آن نقش مهم را ایفا می کنند ولی با کمک Attribute Routing دیگر نام کنترل گر و متد آن نقشی نخواهند داشت، چون مسیرها جدای از متد ()Configure از کلاس Startup در بالای خود تابع شناسانده شده اند. بنابراین بر پایه کد زیر می توانیم نام متدها را تغییر دهیم.

ویژگی controller و action

در Attribute Route های بالا می بینید که بازهم مسیر به نام کنترل گر، مانند Home ارتباط دارد و اگر شما بخواهید اطمینان داشته باشید ه نام کنترل گر در مسیر با نام کلاس کنترل گر همواره همسان باشد، پس می توانیم ویژگی controller را در بالای نام کلاس کنترل گر به کار بریم تا همشه اطمینان داشته باشیم نام کنترل گر در همه مسیرهای شناسانده شده در کلاس، با نام کلاس کنترل گر یکسان باشند. در این مورد، می بینید که دیگر نیازی به نوشتن نام کلاس کنترل گر در مسیرها مانند (“Route(“/Home/Index یا (“Route(“Home/Privacy نیست بلکه به گونه (“Route(“Index و (“Route(“Privacy بازنویسی شده اند زیرا نام کنترل گر در این دو مسیر، خودکار با نام کلاس کنترل گر همگام می شود.