در این مقاله، ما قصد داریم در مورد قابلیتهای مسیریابی (routing) در ASP.NET Core MVC صحبت کنیم. همچنین میخواهیم نحوه تنظیم route ها به دو شیوه مختلف را یاد بگیریم.
اگر برخی از مقالات قبلی این آموزشی سریالی را ندیده اید، توصیه می کنیم صفحه مربوط به این سری آموزشی را مشاهده کنید: آموزش سریالی ASP.NET Core MVC.
برای دانلود سورس مقاله، روی این لینک مراجعه کنید: مسیریابی در ASP.NET Core MVC.
ما این مقاله را به قسمتهای زیر تقسیم میکنیم:
حالا اجازه دهید تا تمامی این موارد را بررسی کنیم.
مسیریابی در ASP.NET Core MVC
مسیریابی، فرآیندی است که از طریق آن، اپلیکیشن، یک مسیر URL ورودی را مورد بررسی قرار داده و action method های متناظر با آن URL را اجرا میکند. ASP.NET Core MVC، از یک میان افزار (middleware) مسیریابی برای تطبیق URL های درخواست های ورودی و map کردن آنها به action method های متناظر استفاده میکند.
ما میتوانیم route ها را یا در کلاس startup یا به عنوان attribute ها تعریف کنیم. این دو روش تعیین میکنند که چطور ما میتوانیم مسیرهای URL را با action method ها تطبیق دهیم. همچنین میتوانیم از route ها، برای تولید URL برای لینکهایی که در response ها ارسال میشوند استفاده کنیم.
دو نوع مسیریابی برای اکشن متدها وجود دارد:
مسیریابی قراردادی
زمانیکه ما با استفاده از قالب پیشفرض، یک اپلیکیشن جدید ASP.NET Core MVC ایجاد میکنیم، آنگاه، اپلیکیشن یک مسیریابی پیشفرض برای ما تنظیم میکند. اجازه دهید یک اپلیکیشن ساخته و آن را امتحان کنیم.
بعد از ایجاد یک پروژه جدید با استفاده از قالب پیشفرض ASP.NET Core MVC، نگاهی به کلاس startup.cs بیندازیم. اینجا میتوانیم ببینیم که اپلیکیشن، یک قانون مسیریابی پیشفرض را در متد ()Configure تنظیم کرده است:
1 2 3 4 5 6 |
app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); |
داخل قسمت فراخوانی ()UseEndpoints، از متد ()MapControllerRoute برای ایجاد یک route با نام default استفاده میکنیم.
MVC، قالب پیشفرض مسیر را به صورت {id?}/{action=Index}/{controller=Home} تنظیم میکند. این الگو، به طور پیشفرض، متد ()Index در HomeController
را با یک پارامتر اختیاری به نام id
تطبیق میدهد. این الگو، همچنین یک URL مانند Books/Details/5/ را نیز تطبیق داده و آن را پوشش میدهد و مقادیر route را { controller = Books, action = Details, id = 5 } با توکن کردن مسیر، استخراج میکند. MVC سعی میکند کنترلری به نام BooksController را پیدا کرده و با ارسال پارامتر id بهعنوان 5، اکشن متد ()Details را اجرا کند.
اپلیکیشن را اجرا کنیم و یک breakpoint در متد ()Index در HomeController قرار دهیم. میبینیم که این متد به طور پیشفرض اجرا میشود. این به این دلیل است که ما این را به عنوان مقادیر پیشفرض در route تعریف کرده ایم.
حالا route پیشفرض را تغییر میدهیم. برای این منظور، یک کنترلر جدید به نام BooksController
با یک اکشن متد ()Details و یک پارامتر اختیاری به نام id اضافه میکنیم:
1 2 3 4 5 6 7 8 |
public class BooksController : Controller { public IActionResult Details(int id) { ViewBag.Id = id; return View(); } } |
سپس یک view برای اکشن متد ()Details ایجاد میکنیم:
1 2 3 4 5 6 7 8 |
@{ ViewData["Title"] = "Details"; int id = ViewBag.Id; } <h1>Details</h1> Book Id : @id |
به محض اینکه اینها درست شدند، بیایید مسیر پیش فرض را در کلاس startup تغییر دهیم:
1 2 3 4 5 6 |
app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Books}/{action=Details}/{id?}"); }); |
حالا برنامه را یکبار دیگر اجرا میکنیم. میبینیم که به طور پیشفرض، متد ()Details در BooksController
اجرا میشود:
در این قسمت، ما نحوه کارکرد مسیریابی قراردادی و نحوه تنظیم route پیشفرض برای یک اپلیکیشن را یاد گرفتیم. حالا ببینیم چطور میتوانیم چند route را با هم پیکربندی کنیم.
مسیرهای چندگانه
ما میتوانیم با چندمرتبه فراخوانی ()MapRoute داخل ()UseEndpoints، چند route را اضافه کنیم. این به ما این امکان را می دهد که چندین قرارداد را تعریف کنیم یا مسیرهایی را اضافه کنیم که به یک اکشن متد خاص اختصاص داده میشوند:
1 2 3 4 5 6 7 8 9 10 11 |
app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "blog", pattern: "blog/{*article}", defaults: new { controller = "Blog", action = "Article" }); endpoints.MapControllerRoute( name: "default", pattern: "{controller=Books}/{action=Details}/{id?}"); }); |
blog
route اینجا، یک route قراردادی اختصاصی است. این از سیستم مسیریابی قراردادی استفاده میکند، اما به یک action خاص اختصاص داده شده است. از آنجایی که اینجا، controller و action در قالب route به عنوان پارامتر ظاهر نشده اند، میتوانند فقط مقادیر پیشفرض داشته باشند و بنابراین این route، همیشه به اکشن متد ()BlogController.Article مپ خواهد شد.
مسیرها در route collection به ترتیب اولویت قرار میگیرند و به همان ترتیبی که ما آنها را اضافه میکنیم مورد پردازش قرار میگیرند. بنابراین در این مثال، MVC، برای درخواستهایی که به سمت اپلیکیشن می آید، برای تطبیق دادن درخواست به route مورد نظر، blog
route را قبل از default
route مورد بررسی قرار داده و امتحان میکند.
اینکه در زمان ایجاد route ها، یک نام برای آنها تعیین میکنیم همیشه رویکرد خوبی است، چرا که آن، یک نام منطقی به route میدهد، طوریکه ما میتوانیم از route نامگذاری شده برای تولید URL استفاده کنیم.
تا اینجا، ما نحوه تنظیم مسیریابی قراردادی را بررسی کردیم. در مرحله بعد، مسیریابی بر اساس Attribute را یاد میگیریم.
مسیریابی بر اساس Attribute
با قرار دادن یک route بر روی controller یا action method، میتوانیم استفاده از ویژگی مسیریابی بر اساس Attribute را فعال سازیم.
اجازه دهید متد ()Configure در کلاس startup.cs را اصلاح کنیم و route های پیشفرض که پیشتر تعریف کرده بودیم را حذف کنیم.
1 2 3 4 |
app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); |
حالا BooksController
را با تعریف attribute های سفارشی در آن، اصلاح میکنیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class BooksController : Controller { [Route("")] [Route("Home")] [Route("Home/Index")] public IActionResult Index() { return View(); } [Route("Home/Details/{id:int}")] public IActionResult Details(int id) { ViewBag.Id = id; return View(); } } |
ما مسیرهای /، /Home
یا /Home/Index
را برای اکشن ()BooksController.Index و Home/Details/{id}/ را برای متد ()Details مشخص کرده ایم. هنگام استفاده از مسیریابی بر اساس Attribute، نام کنترلر و نام اکشن متد، دیگر هیچ نقشی در انتخاب اکشن متدی که باید اجرا شود ندارند.
همچنین میتوانیم از ویژگی های Http[Verb] برای مسیریابی بر اساس Attribute نیز استفاده کنیم:
1 2 3 4 5 6 7 8 9 10 11 |
[HttpGet("/books")] public IActionResult ListBooks() { // ... } [HttpPost("/books")] public IActionResult CreateBook(...) { // ... } |
اینجا، برای مسیر books/، زمانیکه HTTP verb از نوع GET
است، MVC اکشن ()ListBooks و زمانیکه از نوع POST است، اکشن ()CreateBook را اجرا خواهد کرد.
Route attribute های تعریفشده بر روی controller با route attribute های جداگانه بر روی action method ها ترکیب میشوند تا URL کامل را تشکیل دهند. هر قالب route تعریف شده بر روی controller به ابتدای قالبهای route تعریف شده بر روی تمام اکشن متدهای خودش میچسبد. زمانیکه ما یک route attribute را بر روی controller قرار میدهیم، تمام action ها در آن controller، از مسیریابی بر اساس attribute استفاده میکنند.
Attribute route ها، با محصور کردن یک token بین brace های مربعی ([, ]) از جایگزینی token پشتیبانی میکنند. توکن های [action]
, [area]
, و [controller]
با مقادیری از نام action، نام area و نام controller از action ای که route در آن تعریف شده است، جایگزین میشود:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[Route("[controller]/[action]")] public class BooksController : Controller { [HttpGet] public IActionResult List() { // ... } [HttpGet("{id}")] public IActionResult Edit(int id) { // ... } } |
اکشن متد ()List، مسیر Books/List URL/ و متد ()Edit، مسیر Books/Edit/{id}/ را تطبیق میدهد.
در این قسمت، ما نحوه تنظیم مسیریابی بر اساس Attribute را یاد گرفتیم. حالا نگاهی به تنظیم چند route به عنوان attribute بیندازیم.
مسیرهای چندگانه
مسیریابی بر اساس Attribute، تعریف چند route که به یک action منتهی میشود را پشتیبانی میکند. رایجترین مورد استفاده از این رویکرد، دستیابی به عملکرد route پیشفرض در مسیریابی قراردادی است:
1 2 3 4 5 6 7 |
[Route("[controller]")] public class BooksController : Controller { [Route("")] // Matches 'Books' [Route("Index")] // Matches 'Books/Index' public IActionResult Index() } |
با تعریف دو route، متد ()Index، مسیرهای Books/ و Books/Index/ را تطبیق داده و پوشش میدهد.
تمام. حالا چیزهایی که در این مقاله یاد گرفتیم را خلاصه میکنیم.
نتیجه گیری
در این مقاله، ما موضوعات زیر را یاد گرفتیم:
- ایجاد یک الگوی مسیریابی قراردادی برای یک اپلیکیشن ASP.NET Core MVC
- تنظیم مسیریابی بر اساس Attribute برای controller ها و action method ها
- تنظیم چند route برای هر دو مسیریابی از نوع قراردادی و attribute
در قسمت بعدی این سری از آموزش، ما آپلود فایل در ASP.NET Core MVC را بررسی میکنیم. پس با ما همراه باشید.