ویژگی جدید Routing در MVC 6 و تفاوت با MVC 5

یکی از بزرگترین تغییرات در MVC6 ترکیب WebAPI و MVC می باشد. اکنون MVC6 ترکیبی از هردو آن ها می باشد. یعنی این دو تکنولوژی درحال رفتن برای به اشتراک گذاری همان پایه کد، برای بسیاری از مسائل می باشند که routing یکی از آنهاست. در این پست می خواهیم درمورد تغییراتی که در سیستم routing که در mvc6 بوجود آمده و برخی از تفاوت هایش صحبت کنیم.

ویژگی جدید Routing  در MVC 6 و تفاوت با MVC 5

MVC5 Routing : ترکیب HttpGet Routes با HttpPost

یکی از ویژگی های عالی که با MVC5 آمد، ویژگی Routing بود. اما بدون ایراد نبود. برای مثال مقدار Route استاتیک بود. یا حتی بدترین مقدار route که در ورژن HttpGet در هر action استفاده می شد، همچنین HttpPost در action موثر بود. برای مثال به action زیر توجه کنید:

[Route("NewsLetter/SelectEmail/{page?}")]
[HttpGet]
public ActionResult SelectEmail(int? page, string priCat, string secCat)
{
 //Method body
}

در اینجا، یک متد "selectEmail" داریم که به "HttpGet" پاسخ می دهد. حالا فرض کنید که ما یک متد به همان نام را داشتیم، اما بدون هیچ Routing ی. مثلا:

[HttpPost]
public ActionResult SelectEmail(int id)
{
//Method body
}

در MVC5 در وضعیتی مثل این، چیزی که اتفاق می افتد این است که، در حال حاضر متد HttpPost همان route متد HttpGet را دارد زیرا، ما route را برای HttpGet تنظیم کردیم و در حال حاضر مجبوریم route را برای HttpPost به طور خاص تنظیم کنیم. مانند:

[Route("NewsLetter/SelectEmail/{id}")]
[HttpPost]
public ActionResult SelectEmail(int id)
{
//Method body
}

MVC6 Routing : مسیردهی آسان با  MVC6 Routing

اکنون با MVC6 دیگر مشکلی که در بال ذکر شد وجود ندارد. نه تنها آن، بلکه می توانیم یک route راحت مانند [HttpGet("Our Route")] and [HttpPost("Our Route")] را معرفی کنیم.

[HttpGet("NewsLetter/SelectEmail/{page?}")]
public ActionResult SelectEmail(int? page, string priCat, string secCat)
{
 //Method body
}

این باعث می شود که کد ما تمیز بوده و کمتر بهم ریخته شود و ما مشکلات MVC5 را نخواهیم داشت.

MVC6 Routing :  مسیریابی (routing) کنترلر و Action به صورت داینامیک

در قبل مجبور بودیم که controller و نام action را به طور خاص تعریف کنیم و اگر تصمیم به تغییر controller و یا نام action داشتیم، مجبور به تغییر routes نیز بودیم. الان، با ویژگی جدیدی که در MVC6 اضافه شده است، می توانیم اعلام کنیم که می خواهیم از همان نام برای بعضی از بخش های route برای controller یا action استفاده کنیم. 

[Route("[controller]")]
    public class MyController : Controller
    {

      [Route("[controller]/[action]/{id}")]
      [HttpPost]
      [ValidateAntiForgeryToken]
       public ActionResult SelectEmail(int id)
      {

      }
    }

 

MVC6 Routing : تعیین نوع داده و مقدار پیشفرض برای پارامتر Route

با Routing در MVC6  می توانیم نوع داده های پارامتر route را محدود کنیم یا اینکه برای ان مقدار پیشفرض تعیین کنیم:

[HttpGet("details/{id:int=99}")]
        public IActionResult Details(int id)
        {
            return View();
        }