Routing چیست

Routing چیست و Routing attribute چگونه در ASP.Net تعریف میشود ؟

Routing چیست و Routing attribute چگونه در ASP.Net تعریف میشود ؟Reviewed by مهدی نیکخو on Nov 16Rating: 5.0Routing چیست و Routing attribute چگونه در ASP.Net تعریف میشود ؟همان طور که از موضوع مقاله مشخص هستش میخواهیم در مورد Routing ها به طور مفصل صحبت کنیم و بررسی کنیم Routing ها چی هستند و دونستنش چقدر کمک میتونه به ما بکنه !!! اما هممون میدونیم که که در MVC آدرس دهی ( مسیریابی ) به وسیله ی Routing تعیین میشود.

همان طور که از موضوع مقاله مشخص هستش میخواهیم در مورد Routing ها به طور مفصل صحبت کنیم و بررسی کنیم  Routing ها چی هستند و دونستنش چقدر کمک میتونه به ما بکنه !!! اما هممون میدونیم که که در MVC آدرس دهی ( مسیریابی ) به وسیله ی Routing انجام میشود.

از کجا بدونیم Routing در پروژه ام کجا و چیجوری تعریف شده است ؟

معمولا به صورت پیش فرض در روت اصلی پروژه پوشه ی App_Start را باز کنید و یک فایل به نام RoutConfig.cs موجود هست اگر این فایل را باز کنید یک متد با نام RegisterRoutes وجود دارد که وظیفه نحوه آدرس دهی وب اپلیکیشن ما را به عهده دارد.

       public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }

در کد بالا اگر کمی دقت کنیم متوجه میشویم که این قسمت وظیفه مسیر دهی وب اپلیکیشن ما را به عهده دارد، به مشخصه id در کد بالا دقت کنید که به صورت controller/action/id می باشد ساختاری که در MVC به صورت پیش فرض تنظیم شده است که به ترتیب اول controller بعد Action و در آخر id در مسیردهی ما استفاده میشود، اگر این مسیردهی رو جا به جا کنیم تمام مسیردهی مون تغییر میکند اما نکته ای که هست اگر اشتباه مسیر دهی کنیم ممکن است هیچ یک از صفحه ها باز نشود و بر روی تمام اپلیکیشن تاثیر میذاره !!

خب تا این جا در MVC 4 میتوانستیم همین کار رو بکنیم و فقط در همین حد با Routing کار میکردیم اما در MVC 5 ویژگی Route Attribute هم اضافه شده است که قابلیت اضافه کردن صفت هایی در بالای اکشن ها یا کنترلر ها را به ما میدهند:

از مزیت هایی که  Route Attribute  دارا هستش میتوان به موارد زیر اشاره داشت :

  • احتمال خطای کمتر !! اگر تغییراتی در routeConfig.cs  به اشتباهی تنظیم شود  باعث می شود که مشکل آدرس دهی در تمام برنامه اعمال شود اما با روش Route Attribute فقط قسمتی از کنترلر یا اکشن مورد نظر اعمال میشود.
  • به راحتی میتوانیم Map کنیم دو مسیر را با آدرس دهی را به یک اکشن !! چه خوب !! ( شاید الان یکم گیج کننده باشه یکم جلو بیشتر توضیح میدم )

 

خب چگونه Route Attribute استفاده کنیم ؟

کد زیر را اول یه نگاه ریز بکنید و ادامه مطلب را دنبال کنید :

public static void RegisterRoutes(RouteCollection routes)  
{  
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");  
  
tes.MapMvcAttributeRoutes(); //Enables Attribute Based Routing  
  
    routes.MapRoute(  
        name: "Default",  
        url: "{controller}/{action}/{id}",  
        defaults: new { controller = "Product", action = "List", id = UrlParameter.Optional }  
    );  
  
      
}

به کد بالا دقت کنید،  ما برای این که Route Attribute را فعال کنیم یک خط کد به متد RegisterRoutes در کلاس RouteConfig.cs اضافه میکنیم که کد زیر می باشد:

routes.MapMvcAttributeRoutes(); //Enables Attribute Based Routing  

حالا که Route Attribute را فعال کردیم بیایید تست کنیم ببنیم چیجوری کار میکنه ؟!!

[Route("products/{id?}")]  
      public ActionResult Details(string id)   
      {  
          if (string.IsNullOrEmpty(id))   
          {  
              return View("List", GetProductList());  
          }  
            
          return View("Details", GetProductDetails());  
      }  

همان طور که در کد بالا می بینید من برای این کار صفت Route را بالای یکی از اکشن هایم به نام Details که در کنترلر Products پروژه ام اضافه کردم، خب تموم شد به همین راحتی مسیر دهی جدیدی هم برای اکشن Details تعریف کردیم ، حالا اگه اپلیکیشن را اجرا بگیریم به صورت آدرس های  /products/Details/id یا این آدرس products/id  می باشد.

حالا اگه دقت کرده باشید من توی صفت  Route ام بعد از Id یک علامت سوال استفاده کرده ام دلیلیش هم این بود که id در مسیردهی این قسمت اختیاری هستش که در خود اکشن هم بررسی میکنه که اگر مقدار id خالی یا null بود به صفحه ی list محصولات ارجاع داده میشود، اگر هم مقدار داشته باشد می‌رود id محصولی که گرفته شده را نمایش میدهد مثلا 🙂

Route Prefixes چیست ؟

Route prefixes اینطوری هست که یک prefix یا یک پیشوند در بالای کنترلرمان تعریف میکنیم زمانی که خواستیم به هر یک از اکشن های داخل کنترلر این پسوند را اعمال کنیم کافی است با گذاشتن صفت Route در بالای اکشن اعمال میشود به کد زیر توجه کنید و سپس تمرین کنید تا بهتر درک کنید این قسمت رو :

[RoutePrefix("products")]  
    public class ProductController : Controller  
    {  
        //This will be translated to /products  
  
        [Route]  
        public ActionResult List()  
        {  
            return View();  
        }  
  
        //This will be translated to /products/2  
  
        [Route("{id?}")]  
        public ActionResult Details(string id)   
        {  
            if (string.IsNullOrEmpty(id))   
            {  
                return View("List");  
            }  
              
            return View("Details");  
        }  
}

 

چیجوری هستش کارش ؟؟ دقت کنید ما یک کنتلر داریم به نام product که این کنتلر دارای دو اکشن می باشد که آدرس دهی اکشن List به صورت product/List می باشد که با تعریف prefix مسیردهی اکشن List تغییر میکند به /products

حالا جالب تر میتونه مثال اکشن Details باشه که آدرس دهی اش به صورت پیش فرض این بود : /product/Details/id که با تعریف Prefix Route به این شکل تغییر پپیدا کرد /products/id به همین راحتی 🙂

و اما Route Constraints چیست ؟

این هم چیز خاصی نداره فقط کافیه یکم توجه به خرج بدین همه چی اوکی میشه 🙂

زمانی هست برای این که در Route یک سری قوانین یا Rules  تعریف کنیم که اجازه دسترسی با استفاده از اون قوانین بدهیم مثلا اگه id داریم تعریف کنیم که این id باید حتما از نوع کاراکتر باشه به صفحه دسترسی داشته باشه یا از نوع عددی باشه !! برای این که قوانین یا Rules را تعریف کنیم کافی است در Routing به این صورت تعریف کنیم که بعد از کاراکتر “:” باید Rule مون رو تعریف کنیم. به مثال زیر توجه کنید :

//route gets called as /products/productname  
    [Route("products/{id:alpha}")]  
        public ActionResult GetProduct(string name)  
        {  
            return View();  
        }  
  
//route gets called as /products/2  
        [Route("products/{id:int}")]  
        public ActionResult GetProduct(int id)  
        {  
            return View();  
        }

در اکشن اول تنها اجازه میده آدرس هایی که در قسمت id کاراکتر دارند اجازه دسترسی میدهد و در اکشن دوم تنها اجازه دسترسی برای آدرس هایی را میدهد که id آن ها عددی باشد.

و در آخر route Area ها چی هستند ؟

در این قسمت همانند تعریف یک Area عمل میکند با تعریف Route Area قسمت Routing متوجه این میشود که این کنترلر مثلا متعلق به کدوم Area می باشد

[RouteArea("business")]  
    [RoutePrefix("products")]  
    public class ProductController : Controller  
    {  
        //This will be translated to /business/products/list  
  
        [Route]  
        public ActionResult List()  
        {  
            return View();  
        }  
}

در کد بالا همانطور که مشاهده میکنید من یک ناحیه یا Area به نام business تعریف کردم که مثلا اگه بخواهیم لیست محصولات رو ببینیم آدرس دهی به صورت زیر می باشد :

/business/products

به همین راحتی میتونیم ناحیه هامون رو تعریف کنیم

و در آخر خیلی ممنون که وقت تون را به من اختصاص دادین امیدوارم که مقاله خوب و بدرد بخوری نوشته باشم اگه سوالی ، پیشنهادی دارید خیلی خوشحال میشم با من در تماس باشید و همینطور میتونید دست من را در کانال تلگرام به آدرس کانال تلگرام نیکخو آی آر دنبال کنید

 

 

 

مهدی نیکخو

حوزه ی تخصصی ام برنامه نویسی با تکنولوژی های مایکروسافت هستش اما بقیه تکنولوژی های دیگه رو هم دوست میدارم :) من به این اعتقاد دارم که اگه "هرچیزی که یادگرفتم و یاد بدم ، بیشتر یاد میگیرم" برای همین نیکخو آی آر را ساختم تا بنویسم و دوستانی که مثل من زمانی اون مشکل من رو داشتند سریع مشکلشون حل بشه

  1. رایان محمدی

    سلام و تشکر فراوان برای اشتراک گذاری خوبتون
    وب سایت خیلی خوب و کاربردی ای دارید
    به امید موفقیت های روز افزون.

  2. سلام و احترام خدمت مدیر وبسایت
    بنده از مطالب سایت شما لذت بردم و استفاده کردم تبریک میگم سایت خوبی طراحی کردید خواستم از زحماتتون تشکر کنم، باز هم مطالب وبسایت شمارو پیگیری و استفاده خواهم کرد

نظر شما چیست؟