วิธีใช้ 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 กันเถอะ