
یادگیری سی شارپ از مفاهیم پایه تا پروژه محور: شیگرایی، کار با SQL و LINQ، ORMها (Entity Framework)، ساخت پروژه مدیریت رستوران با گزارشات حرفهای و امکانات کامل!
مشاهده بیشتر
یادگیری MVC Core از مبانی تا پیشرفته: شیگرایی، Routing، Entity Framework، امنیت، تست یونیت، Razor، Ajax، و پروژههای کاربردی! یک دوره کامل برای تسلط بر توسعه وب با ASP.NET Core. به صورت حضوری و آنلاین!
مشاهده بیشترمشخصات مقاله
آموزش MVC Core-آموزش ساختار MVC Routing در MVC Core
آموزش MVC Core-آموزش ساختار MVC Routing در MVC Core
مشکل
مسیر یابی(Routing) چگونه در ASP.NET Core MVC کار می کند؟
راه حل
در یک پروژه خالی، کلاس "Startup" را به روزرسانی کنید تا " services " و "middleware" برای MVC اضافه شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | public void ConfigureServices( IServiceCollection services) { services.AddMvc(); } public void Configure( IApplicationBuilder app, IHostingEnvironment env) { app.UseMvc(routes => { routes.MapRoute( name: "goto_one" , template: "one" , defaults: new { controller = "Home" , action = "PageOne" }); routes.MapRoute( name: "goto_two" , template: "two/{id?}" , defaults: new { controller = "Home" , action = "PageTwo" }); routes.MapRoute( name: "default" , template: "{controller=Home}/{action=Index}/{id?}" ); }); } <button></button> |
اضافه کردن "HomeController" برای نشان دادن مسیریابی معمولی (مباحثه را نگاه کنید).
یک کنترلر به نام WorkController را برای نشان دادن ویژگی های مسیریابی اضافه کنید.
مباحثه
مسیریابی(Routing) در ASP.NET Core MVC مکانیسمی است که از طریق آن "درخواست ها(requests)" وارد به "کنترلرها" و "actions ها " شده و نقشه می شوند. این امر با افزودن «میان افزار مسیریابی(Routing middleware)» به «pipeline» و استفاده از «IRouteBuilder» برای نشان دادن الگوی URL (قالب) به کنترلر و actions به دست می آید.
قالب های مسیریابی(Routing Templates)
قالب های مسیریابی از literals ها و tokens ها استفاده می کنند (برای پارامترهای مسیریابی). " literals " دقیقا با متن در URL همسان می شوند، در حالی که " tokens ها" هنگام تطبیق مسیر جایگزین می شوند.
برای مطابقت با یک الگو، باید دارای tokens کنترلر و actions باشد، زیرا این اطلاعات کلیدی است که MVC برای تعیین "کنترلر / actions " استفاده می کند. سایر " tokens ها" در URL به پارامترها و متدهای actions با استفاده از "مدل Binding" نقشه برداری می شوند.
هنگام اضافه کردن یک نقشه بندی مسیر(route mapping)، مقادیر پیش فرض برای " tokens ها" ارائه می شود. این زمانی مفید است که قالب ها حاوی کنترلر یا action " tokens " نیستند. الگوها همچنین می توانند tokens های اختیاری برای پارامترهای action داشته باشند.
بیایید در قالب نمونه ای که برای درک موارد فوق است نگاه کنیم:
1 | contact/{controller=Home}/{action=Index}/{id?} <button></button> |
به نکات زیر توجه داشته باشید :
- " tokens ها" در جفت های مجزا قرار دارند {}.در اینجا ما سه " tokens " داریم، " controller "، " action " و " id ".
- ما همچنین یک literal “contact” داریم که با متن URL همخوانی دارد.
- مقادیر پیش فرض برای controller (Home) و action (Index) ارائه شده است.
- tokens های اختیاری با استفاده از علامت سوال(؟) اعلام می شوند
این URL ها با این الگو مطابقت دارند:
- /contact/Home/Index/1 : مقادیر برای تمام tokens ها ارائه شده است.
- /contact/Home/Index : tokens اختیاری حذف شده است.
- /contact/Home : برای action از پیش فرض Index استفاده شده.
- /contact : به طور پیش فرض برای " controller " و " action " از " Home " و " Index " استفاده شده.
مسیریابی متعارف(Conventional Routing)
Conventional Routing با توجه به یک قالب یک کنوانسیون برای مسیر URL را ایجاد می کند.
- اول token maps به یک کنترلر
- دوم token maps به یک اکشن
- سوم token maps به یک id پارامتر اختیاری اکشن
تا زمانی که مقادیر پیش فرض برای آنها ارائه می شوند ، شما می توانید کنترلر و اکشن را از قالب حذف کنید. به عنوان مثال در مسیر زیر آدرس URL / one را نشان می دهد زیرا پیش فرض ها برای کنترلر های مورد نیاز و token های اکشن ارائه می شود.
1 2 3 4 5 6 | routes.MapRoute( name: "goto_one" , template: "one" , defaults: new { controller = "Home" , action = "PageOne" }); <button></button> |
توجه داشته باشید:
به دلیل این که مسیرها به ترتیب پردازش می شوند، این مسیرهای خاص قبل از قانون کلی اضافه می شوند، به محض اینکه یک فرآیند به پایان می رسد، فرآیند تطبیق(matching) پیدا می شود.
از آنجا که " routing middleware " تنها از "کنترلر ها و اکشن های " توکن برای نقشه(map) / اجرای یک اکشن استفاده می کند ،داشتن چندین اکشن در یک کنترلر با همان نام یک استثناء "مبهم" ("ambiguous" exception)را ایجاد می کند. برای حل این مسئله، ویژگیهای IActionConstraint (به عنوان مثال HttpGet، HttpPost و غیره) میتواند به اکشن اعمال شود.
ویژگی مسیریابی(Attribute Routing)
ویژگی نقشه برای مسیریابی URL ها را با استفاده از قالب مسیریابی به طور مستقیم بر روی کنترلر و اکشن پیاده می کند. وجود کنترلر و اکشن در قالب برای ویژگی مسیریابی اجباری نیست، زیرا آنها هیچ مشکلی در روند مسیریابی ندارند.
ما می توانیم ویژگی های [Route] یا [HttpGet] (و فعل های دیگر) را برای مشخص کردن قالب ها استفاده کنیم. این قالب ها همچنین می توانند عبارت های لیترال و tokens داشته باشند(به جز توکن کنترلر ها و اکشن ها).
ویژگی های اعمال شده به کنترلر با آنهایی که در یک اکشن هستند ادغام می شوند ، به عنوان مثال، در WorkController، عمل PageOne می تواند از طریق /work/one URL قابل دسترسی باشد.
URL Generation
به جای آدرس hard-coding در برنامه ما، ما می توانیم از مکانیسم های مسیریابی MVC برای تولید URL ها استفاده کنیم. MVC اطلاعاتی در اختیار شما قرار می دهد که در قالب هایی که برای نقشه های مسیریابی وجود دارد ارائه شده است.MVC
رابط کاربری IUrlHelper را فراهم می کند تا توانایی ایجاد URL را به طور خلاصه حذف کند.این کار از طریق Url properties کلاس پایه controller ، views و view components انجام می شود.
دو متد کلیدی IUrlHelper برای تولید URL ها وجود دارد:
- Action : با ارائه action ، controller و route values
- RouteUrl : با ارائه نام action و route values
اگر کنترلر یا route values پارامترهای متدشان از دست رفته باشند، MVC این را از request های فعلی یا پارامتر متدها انتخاب می کند (همانند مقادیر محیط(ambient)).
" Route values " به عنوان " anonymous object " عرضه می شود.
اگر MVC نمیتواند از این مقادیر به URL tokens نقشه بسازد، اینها با URL به عنوان پارامترهای query string پیوند داده می شوند.
برای ویژگی مسیریابی ، URL با نگاه به [Route] ارائه شده در یک اکشن ساخته شده است.
یک متد راحت در کلاس ControllerBase در واقع RedirectToAction هست که با استفاده از URL generation یک action result تولید می کند که می تواند درخواست کاربر را تغییرمسیر بدهد.
IurlHelper
برای تزریق IUrlHelper به عنوان وابستگی، ابتدا باید آن را به service container اضافه کنید.
1 2 3 4 5 6 7 8 | services.AddSingleton< IActionContextAccessor, ActionContextAccessor >(); services.AddScoped< IUrlHelper >(factory = > { var actionContext = factory.GetService< IActionContextAccessor >() .ActionContext; return new UrlHelper(actionContext); }); <button></button> |
نمونه
در سورس کد نمونه سه کنترلر برای ارائه conventional routing(مسیر یابی متعارف )، attribute routing(ویژگی های مسیر یابی)، URL generation وجود دارد. بهترین راه برای درک مسیریابی اینست که کد را دانلود کنید و با آن بازی کنید، قالب ها را تغییر دهید تا ببینند چگونه مسیریابی کار می کند.
شما می توانید Source Code این مقاله را از لینک زیر دانلود کنید:
1 2 | https: //github.com/TahirNaushad/Fiver.Mvc.Routing <button></button> |