قابلیت Attribute Routing در ASP.NET MVC 5
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: یک دقیقه

در ASP.NET MVC 5 یک قابلیت جدید با نام Attribute Routing افزوده شده است که به ما این اجازه را می‌دهد تا Route‌های سفارشی برای کنترلرها و اکشن متدهایمان با اضافه کردن یک Attribute با نام Route تعریف کنیم.
همچنین می‌توانیم ویژگی RoutePrefix نیز برای کنترلرهایمان تعریف کنیم تا همه‌ی اکشن متدها نیز از آن پیروی کنند. این ویژگی را با ذکر یک مثال معرفی میکنیم :

ابتدا لازم است این ویژگی را در کلاس RouteConfig فعال کنیم :
public static void RegisterRoutes(RouteCollection routes) 
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapMvcAttributeRoutes();

    // ...
}

قدم بعدی تنها افزودن Attribute‌های ذکر شده به کنترلر و اکشن متدهایمان می‌باشد، به طور مثال ما در اینجا یک کنترلر با نام ProductController ایجاد کرده ایم و کنترلر را با ویژگی RoutePrefix مزین کرده ایم که در این حالت به ASP.NET MVC می‌گویم که تمام اکشن متدهای داخل این کنترلر با products شروع شوند :
[RoutePrefix("products")]
public class ProductsController : Controller 
{
    public ProductsController() 
    { 
    }

    [Route]
    public ActionResult Index() 
    {
        return View();
    }
}

همانطور که در کد فوق ملاحظه می‌کنید اکشن متد Index را با افزودن ویژگی Route که آدرس ~/products را تطبیق می‌دهد تعیین کرده ایم.

نحوه تعیین Optional URI Parameter :

کافی است علامت سوال را به آخر پارامتر اضافه کنیم :
[Route("{id?}")]
public ActionResult Index(int id) 
{
   return View();
}
نحوه تعیین Default Route :
[RoutePrefix("products")]
[Route("{action=index}")]
public class ProductsController : Controller 
{
    public ProductsController() 
    { 
    }
    public ActionResult Index() 
    {
        return View();
    }
}
نحوه تعیین Constraint برای Routeها :
[Route("{id:int}")]
public ActionResult Delete(int id) 
{
   return View();
}
در مثال فوق گفته ایم که Id باید از نوع عدد صحیح باشد در غیر اینصورت آن را تطبیق نمی‌دهد.
همچنین می‌توانید از عبارات Regex نیز استفاده کنید به طور مثال در کد زیر پارامتر title باید یک متن و یا عبارت فارسی باشد در غیر اینصورت تطبیقی صورت نمی‌گیرد:
​[Route("{title:regex(\u0600-\u06FF)}")]
public ActionResult Search(string title)
{
   return View();
}​
در لینکی که در بالا معرفی شده لیست کامل Constraint‌ها را می‌توانید مشاهده نمائید،
  • #
    ‫۱۰ سال و ۱۰ ماه قبل، یکشنبه ۱۷ آذر ۱۳۹۲، ساعت ۱۳:۳۱
    با تشکر از شما. آیا در این حالت ذکر مسیریابی پیش فرض الزامی است؟ یعنی باید بالای تمام کنترلرها مثال default route شما را لحاظ کرد؟
    • #
      ‫۱۰ سال و ۱۰ ماه قبل، یکشنبه ۱۷ آذر ۱۳۹۲، ساعت ۱۳:۴۵
      سلام،
      اگر حالت فوق را فعال نکنید پیش فرض مسیر یابی همانند مسیریابی‌های قبلی در MVC 4 خواهد بود.
      • #
        ‫۱۰ سال و ۱۰ ماه قبل، یکشنبه ۱۷ آذر ۱۳۹۲، ساعت ۱۶:۳۱
        مطابق مقاله‌ای که ابتدای بحث لینک داده شده، امکان ترکیب هر دو حالت attribute routing و convention-based routing با هم وجود دارد و اگر در حالت قدیمی یعنی convention-based routing، شما مثل قبل یک default route تعریف کرده باشید، دیگر نیازی به ذکر و تکرار default route هم نام یک کنترلر در حالت attribute routing نخواهید داشت و فقط جایی که واقعا نیاز است باید از آن استفاده کرد. attribute routing کار رو برای تعریف قیدها یا constraints خیلی ساده و طبیعی کرده.
  • #
    ‫۱۰ سال و ۱۰ ماه قبل، یکشنبه ۱۷ آذر ۱۳۹۲، ساعت ۱۵:۴۵

    ضمن تشکر از مطلب خوبتون از این قابلیت چگونه برای آدرس دهی اتوماتیک استفاده کرد؟

    برای مثال در بالا اکشن Index یک پارامتر Id دارد . چطوری می‌توان با ذکر products و Id مستقیما به اکشن Index فوروارد بشه یعنی : http://localhost/products/10 

    این سوال و بدون قابلیت مذکور و در Mvc4 چطوری صحیح‌تر است انجام شود؟

    • #
      ‫۱۰ سال و ۱۰ ماه قبل، یکشنبه ۱۷ آذر ۱۳۹۲، ساعت ۱۶:۰۵
      این آدرس‌هی خودکار هست. نیاز به کار اضافه‌تری نداره؛ چون action پیش فرض مسیر رو مقدار دهی کرده (البته ذکر این attribute routing هم ضروری نیست؛ اگر مثل قبل یک default route پیش فرض تعریف شده باشه):
      [Route("{action=index}")]
       برای اطلاعات بیشتر این مطلب رو مطالعه کنید: asp-net-mvc-4
  • #
    ‫۱۰ سال و ۱ ماه قبل، چهارشنبه ۱۲ شهریور ۱۳۹۳، ساعت ۱۶:۵۵
    سلام و ممنون بابت انتشار این موضوع مفید.
    یک سئوال داشتم: برای ایجاد زیر دامنه چه راهکاری هست؟
    مثلا: forum.site.com
    • #
      ‫۱۰ سال و ۱ ماه قبل، چهارشنبه ۱۲ شهریور ۱۳۹۳، ساعت ۱۷:۰۴
      ساب دومین ارتباطی به مسیریابی نداره چون مسیریابی مرتبط هست به اجزایی از URL که بعد از دومین و پورت آن مشخص می‌شوند. همینقدر که ساب دومین در IIS تعریف شده (به همراه تنظیمات DNS آن؛ مثلا تنظیم فایل hosts)، سیستم مسیریابی خودش رو با اون انطباق می‌ده. 
  • #
    ‫۱۰ سال و ۱ ماه قبل، پنجشنبه ۱۳ شهریور ۱۳۹۳، ساعت ۱۳:۵۱
    سلام؛ با تشکر از توضیحاتتون. من نمی‌خوام که نام کنترلر و اکشن‌ها در url سایت نمایش داده شه.
    من مثلا در اکانت کنترلر از [RoutePrefix("manageuser")]  استفاده کردم و بالای اکشن موردنظرم از [Route] استفاده کردم ولی تنها تاثیرش این بود که با url پیش فرض قبلی به صفحه دسترسی نداشتم ولی به جای نام کنترلر  manageuser  هم وارد می‌کردم فایده نداشت. در ضمن در RegisterRoutes ، routes.MapMvcAttributeRoutes();  هم اضافه کردم
    ممنون میشم راهنماییم کنید