ASP.NET
ریدایرکت در ASP.NET

ریدایرکت در ASP.NET

ریدایرکت (redirect) یکی از موارد کاربردی در هر زبان برنامه نویسی تحت وب است. با استفاده از این قابلیت می توانید کاربر را به صفحه دلخواه هدایت کنید.

در این مطلب میخواهیم انواع ریدایرکت در ASP.net را بررسی کنیم. متدهای مربوط به redirect در ASP در کلاس Controllerbase قرار دارد و به صورت پیش‌فرض در داخل Controller به آن‌ها دسترسی داریم.

Redirect()

اولین روش برای انتقال از یک URL به URL دیگر استفاده از Redirect()  است که باید یک آدرس را به عنوان پارامتر به آن ارسال کنیم. این تغییر آدرس از نوع 302 یا موقت است. آدرس میتواند یکی از صفحات داخلی باشد:  

public IActionResult Test()
{
    return Redirect("/terms");
}

یا اینکه آدرس به یک سایت خارجی:  

public IActionResult Test()
{
    return Redirect("http://google.com");
}

در تصویر زیر نوع ریدایرکت، صفحه مبدا و مقصد مشخص است.

ریدایرکت در asp

مورد مهمی که وجود دارد اینکه درخواست POST به POST انجام نمی شود.

RedirectPermanent()

این روش مانند Redirect()  است، با این تفاوت که از نوع 301 یا ریدایرکت  دائمی است. RedirectPermanent برای صفحاتی که حذف شده‌اند و یا آدرس آن‌ها تغییر کرده کاربرد دارد.

RedirectPreserveMethod()

RedirectPreserveMethod نیز شبیه بهRedirect()  است، اما status code را روی 307 تنظیم می‌کند. کد 307 از نوع ریدایرکت موقت هست ولی تفاوتی که با Redirect()  دارد این است که درخواست POST بهPOST  انجام می‌شود ولی درخواست POST به GET انجام نمی‌شود. کد 307 بروی نسخه 1.1 HTTP قابل استفاده است. کد زیر به درستی کار می‌کند:

[HttpPost("terms")]
public IActionResult Terms() => View();
[HttpPost]
public IActionResult Test()
{
    return RedirectPreserveMethod("/terms");
}

اما کد زیر با خطای 405 روبرو می‌شود:

[HttpGet("terms")]
public IActionResult Terms() => View();
[HttpPost]
public IActionResult Test()
{
    return RedirectPreserveMethod("/terms");
}

RedirectPermanentPreserveMethod()

مشابه با RedirectPreserveMethod است، با این تفاوت که کد وضعیت را روی 308 یا ریدایرکت دائمی تنظیم می‌کند. کد 308 نیز بر روی نسخه 1.1 پروتکل HTTP در دسترس است.

تقریبا اکثر مواردی بعدی نیز مثل 4 مورد بالایی هستند که تفاوت‌های جزئی با هم دارند که آن‌ها را هم بررسی می کنیم.

RedirectToAction(),RedirectToActionPermanent(), RedirectToActionPreserveMethod(), RedirectToActionPermanentPreserveMethod()

همانطور که اشاره شد این موارد هم شبیه 4 مورد اول هستند، اما تفاوتی که دارند این است می توان به صورت دقیق‌تر آدرس Controller  و Action و مقادیر دیگر مانند Id و... تنظیم کرد. در نظر داشته باشید که این 4 متد فقط برای آدرس‌های داخلی کاربرد دارند.

public IActionResult Test()
{
    return RedirectToAction("Product", "Home", new { id = 1 });
}
public IActionResult Product(int id)
{
    return View();
}

در کد بالا مقدار اول در RedirectToAction نام Action، مقدار دوم نام Controller و مقدار سوم یک object از پارامترهای ارسالی هست.

کد را به صورت زیر نیز می‌توان نوشت:

public IActionResult Test()
{
    return RedirectToAction(nameof(Product), nameof(HomeController), new { id = 1 });
}
public IActionResult Product(int id)
{
    return View();
}

امکان ریدایرکت به کنترلرهای دیگر نیز وجود دارد.

 RedirectToPage(), RedirectToPagePermanent(), RedirectToPagePreserveMethod(), RedirectToPagePermanentPreserveMethod()

این چهار متد برای ریدایرکت به صفحاتی که از نوع razor page هستند به کار می‌روند. می توان نام razor page مورد نظر، handler  و یک object  از پارامترهای مورد نیاز را نیز برای آن قرار داد. اگر یک razor page مانند کدهای زیر داشته باشیم:

public class PageModel : Microsoft.AspNetCore.Mvc.RazorPages.PageModel
{
    [BindProperty(Name = "id", SupportsGet = true)]
    public int Id { get; set; }
    public void OnGet()
    {
    }
    public void OnGetTest()
    {
    }
}

به شکل زیر مقادیر RedirectToPage را قرار می‌دهیم:

public IActionResult Test()
{
    return RedirectToPage("Page", "Test", new { id = 1 });
}

 RedirectToRoute(), RedirectToRoutePermanent(), RedirectToRoutePreserveMethod(), RedirectToRoutePermanentPreserveMethod()

برای این متدها می‌توانید نام route قرار دهید. در کد زیر URL به آدرس /blog/article/1 تغییر می‌کند و فقط با نام route  می‌توان رایدایرکت را انجام داد.

public IActionResult Test()
{
    return RedirectToRoutePermanent("Article", new { id = 1 });
}
[HttpGet("Blog/Article/{id}", Name = "Article")]
public async Task<IActionResult> Article(int id)
{
    return View();
}

همچنین امکان قرار دادن نام route که در فایل Startup.cs یا Program.cs  (در .net6 به بعد) تعریف شده وجود دارد:

app.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
   public IActionResult Index()
{
    return RedirectToRoute("default", new { controller = "Home", action = "Privacy" });
}

  LocalRedirect(), LocalRedirectPermanent(), LocalRedirectPreserveMethod(), LocalRedirectPermanentPreserveMethod()    

این متدها کاملا شبیه به Redirect() هستند ولی همانطور که از نام آن‌ها پیداست برای ریدایرکت به صفحات داخلی کاربرد دارند. در صورتی که لینک خارجی مانند https://google.com را قرار دهید با خطا مواجه خواهید شد.