نویسار

یادداشت های یک برنامه نویس وب

نویسار

یادداشت های یک برنامه نویس وب

نویسار

اینجا صرفا محلی برای یاداشتها و بیان تجربه های شخصی صاحب وبلاگ می باشد.

پیوندهای روزانه

مسیر یابی در ASP.NET MVC 4 (قسمت اول)

چهارشنبه, ۲۹ خرداد ۱۳۹۲، ۰۴:۲۰ ب.ظ



یکی از مهمترین ویژگی های جدید MVC مسیر یابی است. مسیریابی به ما کمک می کند تا درخواست هایی رسیده را به کنترلر ها و اکشن ها هدایت کنیم. ماژول مسیر یابی در اسمبلی System.Web.Routing قرار دارد که به ما کمک می کنه که در بیرون از MVC هم بتونیم از این قابلیت استفاده کنیم، مثلا در Webforms .

در این مقاله ما با جزئیات مهم مسیر یابی آشنا خواهیم شد. در ابتدا از مفاهیم پایه شروع خواهیم کرد و آهسته به سمت مفاهیم پیشرفته و در آخر خواهیم دید که چگونه می توان به سادگی یک مسیر یابی دلخواه رو با استفاده از متد های الحاقی ایجاد کرد.

مفاهیم پایه    

تمام مسیر های استفاده شده در MVC Application باید در رویداد Application_Start() در فایل Global.asax.cs قرار بگیرند. وقتی که ما یک پروژه جدید رو در ویژوال استودیو با استفاده از قالب های توکار موجود ایجاد می کنیم، می بینیم که یک متد با نام RegisterRoutes در فایل RouteConfig.cs قرار دارد که ما تمامی مسیرهای استفاده شده در برنامه را درون این متد  تعریف می کنیم.

1.     public static void RegisterRoutes(RouteCollection routes)

2.     {

3.     routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

4.      

5.            routes.MapRoute(

6.                     name: "Default",

7.                     url: "{controller}/{action}/{id}",

8.                     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }

9.            );

10.   }

کد 1. RegisterRoute و مسیر پیش فرض

اگر به رویداد Application_Start() نگاه کنیم میبینیم که متد RegisterRoutes در اون فراخوانی شده است.

1.     RouteConfig.RegisterRoutes(RouteTable.Routes);

سوال : RouteTable چیست؟

RouteTable جایی است که تمامی مسیرهای تعریف شده در آن قرار میگیرند. RouteTable دارای یک خصیصه به نام Routes  از نوع RouteCollection می باشد که ما تمامی مسیرهای خود را اینجا اضافه می کنیم.

حالا اگر به متد RegisterRoutes (کد 1)نگاه کنیم میبینیم  که یک سری متدها در اون فراخوانی شده است . فعلا به متد IgnoreRoute کاری نداریم و می خواهیم درباره MapRoute صحبت کنیم.

MapRoute

همانطور که حدس زدید، MapRoute متدی برای اضافه کردن مسیر های جدید به برنامه مون است. اما این متد متعلق به اسمبلی System.Web.Routing نمی باشد و متدهای الحاقی هستند که در System.Web.Mvc تعریف شده اند.

در زیر سربارهای متفاوت متدهای الحاقی MapRoute رو مشاهده می کنید.

1.     public static Route MapRoute(this RouteCollection routes, string name, string url);

2.     public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults);

3.     public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints);

4.     public static Route MapRoute(this RouteCollection routes, string name, string url, string[] namespaces);

5.     public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, string[] namespaces);

6.     public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults,object constraints, string[] namespaces);

 

مسیر پیش فرض کمی برای شروع پیچیده است پس بحث رو با یک مثال ساده تر شروع می کنیم.

1.     routes.MapRoute("MyRoute", "{controller}/{action}");

کد 2. یک مسیر ساده

پارامتر اول نام مسیر هست که کاملا اختیاری می باشد (ولی توصیه می شود که به کار برده شود) . قسمت دوم یک الگو می باشد که اکثر افراد رو گیج می کنه، این الگو مثل عبارات با قاعده یا Regular Expression نیست که شامل بخش های می شوند که توسط پارامترهایی در آدرس پر شوند. الگوی بالا شامل دو بخش می باشد: {controller} و {action} .هر دوی این قسمت ها بین {} قرار گرفته اند که یعنی می تونند با بیشتر از یک مقدار مطابقت داده شوند.

خب حالا ببینیم چه جور Url هایی با این مسیر ساده مطابقت داده می شوند. تمامی آدرس هایی که شامل تنها دو بخش باشند با این مسیر مطابقت دارند. به عنوان مثال آدرس زیر یعنی party/index  که party با {controller} و index با  {action} مطابقت داده می شوند.

http://www.webdeveloper.blog.ir/party/index

مثال های دیگر که با این مسیر مطابقت دارند :

http://www.webdeveloper.blog.ir/comment/post
http://www.mysite.com/home/index

درباره اینها چطور؟

http://www.partyplanner.com/home
http://www.partyplanner.com/party/get/2

اینها با مسیر مطابقت ندارند. آدرس اول تنها شامل یک بخش می باشد home ، و آدرس دوم شامل سه بخش می باشد یعنی party و get و یک عدد integer یعنی 2. پس نمی توانند با مسیر ما تطبیق داده شوند.

مقادیر پیش فرض یا Default Values

ما می توانیم وقتی که یک مسیر را تعریف می کنیم به بخش های اون مقادیر پیش فرض ارسال کنیم. تعریف کردن مقدار پیش فرض برای مسیر بسیار کمک کننده است، به عنوان مثال وقتی که شما می خواهید آدرس http://www.partyplanner.com رو مسیردهی کنید که نه دارای controller ونه دارای action است باید هنگام تعریف مسیر به آنها مقادیر پیش فرض بدهید.

اگر به (کد 1) نگاه کنید میبینید که پارامتر سوم که به id ارسال می شود یک شئ نامشخص می باشد. یک شئ نامشخص می تواند هر چیزی به عنوان controller یا action و یا پارامتر در آدرس باشد. مثلا یک عدد integer و یا یک نوع رشته ای string .

حالا می خواهیم مثال (کد 2) را دوباره با استفاده از ارسال مقادیر پیش فرض دوباره بنویسیم.

1.     routes.MapRoute(

2.     "MyRoute",

3.     "{controller}/{action}",

4.     new { controller = "party", action = "index" });

کد 3. ارسال مقادیر پیش فرض به مسیر

هر آدرسی  باید مقادیر controller و action را دارا باشد اما اگر این اطلاعات موجود نباشد آنگاه یکی از مقادیر پیش فرض جای آنرا خواهد گرفت. به عنوان مثال اگر کاربر action را مشخص نکند آنگاه مسیر بالا اکشن index را انتخاب خواهد کرد. همچنین اگر کاربر هیچکدام از مقادیر action و یا controller را تعیین ننماید، (مثلا با آدرسی مثل : http://www.partyplanner.com)  آنگاه مسیر مقدار party را برای controller در نظر خواهد گرفت و مقدار index را نیز برای action قرار خواهد داد.

اگر دوباره به مسیر پیش فرض تعریف شده در RouteConfig.cs توجه کنید :

1.     routes.MapRoute(name: "Default", url: "{controller}/{action}/{id}",

2.     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }

3.     );

 

می بینید که این مسیر دارای سه بخش می باشد. بخش controller و action و id که برای همه آنها مقادیر پیش فرض تعیین شده است.

آدرس هایی که با این الگوی مسیر مطابقت دارند مثل زیر خواهند بود:

http://www.partyplanner.com/party/get/1
http://www.partyplanner.com/party/get
http://www.partyplanner.com/party
http://www.partyplanner.com

تعریف الگوهای مسیر پیچیده

از طریق مسیریابی ما می توانیم به راحتی هر مسیر پیچیده ای را به یک action بفرستیم.

·         مسیر 1

1.    routes.MapRoute(

2.    "Search",

3.    "{controller}/search/query={query}?p={p}",

4.    new { controller = "Home", action = "Search", query = UrlParameter.Optional, p = 1 }

5.    );

مثال:

http://www.prideparrot.com/home/search
http://www.prideparrot.com/home/search/query=sql
http://www.prideparrot.com/home/search/query=sql?p=12

·         مسیر 2

1.    routes.MapRoute(

2.    "Archive",

3.    "{controller}/{action}/{year}/{month}/{day}/{filename}",

4.    new { controller = "Blog", action = "Archive" }

5.    );

مثال:

http://www.prideparrot.com/blog/archive/2012/12/1/routing_in_aspnetmvc

·         شامل شدن تمام بخش ها

1.    routes.MapRoute(

2.    "CustomRoute",

3.    "product/{*param}",

4.    new { controller = "Product", action = "Index" }

5.    );

 

مثال :

http://mysite.com/product/hello
http://mysite.com/product/hello/a/b/c

نکته جالب درباره مسیر بالا، بخش دوم در الگوی آدرس یعنی {*param}  می باشد که با یک * شروع شده است. کاراکتر * یعنی که هر بخشی بعد از این  حتی اگر با / جدا شده باشد را با مسیر تطبیق دهد.

 

·         شامل شدن تمام مسیر ها

1.     routes.MapRoute(

2.     "CatchAllRoute", "{*url}",

3.     new { controller = "Home", action = "Index", url = UrlParameter.Optional });

این یکی تقریبا شبیه مثال قبل هست که این مسیر تمامی آدرس ها رو شامل میشه.

مثال:

http://mysite.com
http://mysite.com/product/hello
http://mysite.com/home/index/hello/text/1

·         مسیر با جدا کننده متفاوت

1.     routes.MapRoute(

2.     "MyRoute",

3.     "{controller}~{action}~{id}");

 

شما می توانید به جای استفاده از جداکننده "/"  از "~" هم استفاده کنید. مثلا : http://mysite.com/product~list~1

 

 ادامه دارد...

نظرات  (۳)

سلام ممنون
متشکرم از آموزش خوبتون
آیا امکان دارد که در مسیریابی از یک عبارت ثابت مثل .aspx یا .php استفاده کنیم طوریکه کاربر به اشتباه فرض کند با یک صفحه دات نت یا پی اچ پی روبرو شده؟
برای مثال
http://sample.com/mycontroller/action.PHP
سلام یک سوالی داشتم میخاستم ببیینم میشه مسیر هارا در mvc فارسی کرد مثلا به این صورت
www.abc.com/comment/نظرات
پاسخ:
بله.
می تونید اینجا و اینجا را مطالعه کنید.

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
تجدید کد امنیتی