วิธีใช้ RedirectToAction ใน ASP.NET MVC โดยไม่สูญเสียข้อมูลการร้องขอ

เมื่อทำงานกับ ASP.NET MVC โดยเฉพาะระหว่างการส่งฟอร์ม คุณอาจพบกับสถานการณ์ที่จำเป็นต้องทำการเปลี่ยนเส้นทางโดยใช้ RedirectToAction นี่มักเกิดขึ้นหลังจากที่ผู้ใช้ส่งฟอร์มที่มีข้อผิดพลาดในการตรวจสอบข้อมูล และคุณต้องการเปลี่ยนเส้นทางผู้ใช้กลับไปยังฟอร์มเดิม อย่างไรก็ตาม คุณยังต้องการให้ URL แสดงฟอร์มนั้นแทนที่จะเป็นหน้าการดำเนินการที่ส่งข้อมูลไป ยังมีความท้าทายในการรักษาข้อมูล POST ดั้งเดิมเพื่อความสะดวกของผู้ใช้และการตรวจสอบข้อมูลขณะทำการเปลี่ยนเส้นทาง

อธิบายปัญหา

เมื่อฟอร์มถูกส่งใน ASP.NET MVC ข้อมูลที่ส่งมักเป็นส่วนหนึ่งของคำขอ POST หากเกิดข้อผิดพลาดในการตรวจสอบข้อมูลและคุณใช้วิธีการเปลี่ยนเส้นทาง (เช่น RedirectToAction) วิธีการ HTTP จะเปลี่ยนจาก POST เป็น GET ดังนั้น หมายความว่าข้อมูลฟอร์มทั้งหมดที่เกี่ยวข้องจะสูญหายอย่างมีประสิทธิภาพ หากคุณพยายามใช้พารามิเตอร์อย่าง ViewData ข้อมูลฟอร์มจะไม่ถูกส่งต่อเนื่องจากจะถูกแปลงเป็นพารามิเตอร์ GET ไม่รักษาข้อมูล POST ดั้งเดิมตามที่คุณต้องการ

วิธีแก้ปัญหา: ใช้ TempData

แนวทางที่ดีที่สุดในการเก็บข้อมูลการร้องขอโดยไม่สูญหายในกระบวนการเปลี่ยนเส้นทางคือการใช้ TempData TempData อนุญาตให้คุณจัดเก็บข้อมูลชั่วคราว ซึ่งจะยืดเยื้อเพียงระยะเวลาของคำขอปัจจุบันและคำขอถัดไปเท่านั้น ซึ่งทำให้เหมาะสมกับกรณีการใช้งานของคุณ

มาดูวิธีที่คุณสามารถนำวิธีแก้ปัญหานี้ไปใช้ได้ทีละขั้นตอน

ขั้นตอนที่ 1: เก็บข้อมูลการร้องขอใน TempData

ในวิธีการดำเนินการของคุณที่จัดการการส่งฟอร์ม คุณสามารถบันทึกข้อมูล Request.Form ไปยัง TempData ก่อนที่จะทำการเปลี่ยนเส้นทาง นี่คือโค้ดที่แสดง:

public ActionResult Send()
{
    TempData["form"] = Request.Form;
    return this.RedirectToAction(a => a.Form());
}

ขั้นตอนที่ 2: ดึงข้อมูลในวิธีการที่เปลี่ยนเส้นทางไป

ในวิธีการดำเนินการที่คุณเปลี่ยนเส้นทางไป (ในกรณีนี้คือวิธีการ Form) คุณจะตรวจสอบว่ามีข้อมูลใด ๆ ที่จัดเก็บอยู่ใน TempData หรือไม่ หากมี คุณสามารถทำการแคสต์กลับไปยังประเภทคอลเลกชันที่เหมาะสมและใช้งานตามต้องการ:

public ActionResult Form()
{
    // ประกาศ viewData เป็นต้น

    if (TempData["form"] != null)
    {
        // แคสต์ TempData["form"] ไปยัง System.Collections.Specialized.NameValueCollection
        var formData = (System.Collections.Specialized.NameValueCollection)TempData["form"];
        
        // ใช้ formData ตามต้องการ
    }

    return View("Form", viewData);
}

ประเด็นสำคัญที่ต้องจำ

  • TempData มีอายุอยู่ในคำขอเดียวและคำขอถัดไป โดยอนุญาตให้คุณรักษาข้อมูลระหว่างการเปลี่ยนเส้นทางซึ่งจำเป็นต่อการตรวจสอบข้อมูล
  • ตรวจสอบให้แน่ใจว่าแคสต์ TempData["form"] อย่างถูกต้องเพื่อเข้าถึงข้อมูลฟอร์มได้อย่างมีประสิทธิภาพ
  • ควรตรวจสอบค่าว่างก่อนที่จะเข้าถึง TempData เพื่อป้องกันข้อยกเว้นที่อาจเกิดขึ้น

สรุป

การเปลี่ยนเส้นทางกลับไปยังฟอร์มในขณะที่รักษาข้อมูลคำขอ POST ดั้งเดิมใน ASP.NET MVC เป็นไปได้โดยใช้ TempData วิธีนี้ช่วยให้ประสบการณ์ของผู้ใช้ยังคงราบรื่นและตรวจสอบข้อมูลที่จำเป็นสามารถดำเนินการได้โดยไม่สูญเสียบริบท โดยนำวิธีแก้ปัญหาข้างต้นมาใช้ คุณสามารถจัดการการส่งฟอร์มและการเปลี่ยนเส้นทางในลักษณะที่มีผู้ใช้เป็นศูนย์กลางได้อย่างมีประสิทธิภาพ

โดยการใช้ TempData คุณมั่นใจได้ว่าผู้ใช้จะพบว่าข้อมูลที่ป้อนของตนยังคงอยู่ในกรณีที่เกิดข้อผิดพลาดในการตรวจสอบข้อมูล ส่งเสริมความน่าเชื่อถือและความสามารถในการใช้งานของแอปพลิเคชันของคุณ

มาทำให้ประสบการณ์ของผู้ใช้เป็นไปอย่างราบรื่นใน ASP.NET MVC กันเถอะ