ASP.NET MVC - TempData - การปฏิบัติที่ดีหรือไม่ดี


96

ฉันใช้AcceptVerbsวิธีการที่มีรายละเอียดในบล็อกโพสต์ Preview 5 ของ Scott Gu เพื่อจัดการกับรายการแบบฟอร์มใน ASP.NET MVC:

  • ผู้ใช้ได้รับแบบฟอร์มเปล่าผ่าน GET
  • ผู้ใช้โพสต์แบบฟอร์มที่กรอกผ่าน POST ไปยัง Action เดียวกัน
  • การดำเนินการตรวจสอบความถูกต้องของข้อมูลดำเนินการที่เหมาะสมและเปลี่ยนเส้นทางไปยังมุมมองใหม่

เลยไม่ต้องใช้TempData. ที่กล่าวว่าตอนนี้ฉันต้องเพิ่มขั้นตอน 'ยืนยัน' ในกระบวนการนี้และดูเหมือนว่าจะต้องใช้TempDataไฟล์.

ด้วยเหตุผลบางอย่างฉันไม่ชอบใช้TempData- มันเป็นสิ่งที่ต้องออกแบบมา

นี่เป็นข้อกังวลที่ถูกต้องหรือฉันกำลังทำมันขึ้นมา?


1
พิจารณากำหนดขั้นตอน "ยืนยัน" ของคุณให้เป็นกล่องโต้ตอบจาวาสคริปต์ การเดินทางรอบเซิร์ฟเวอร์น้อยลงและคุณจะไม่พบปัญหานี้
ajma

คำตอบ:


26

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

ฉันสงสัยว่าปัญหาคือคุณมีการดำเนินการเปลี่ยนเส้นทางไปยังหน้าอื่นก่อนขั้นตอนยืนยัน ฉันสงสัยว่าหลังจากที่พวกเขาส่งครั้งแรกคุณสามารถดำเนินการได้มากพอที่จะสร้างกล่องโต้ตอบยืนยันจากนั้นส่งกลับหน้าเดิมพร้อมคำถามยืนยัน เช่นเดียวกับวิธีการตรวจสอบความถูกต้องของคุณยกเว้นกฎการตรวจสอบความถูกต้องจะตรวจสอบว่าได้ดำเนินการขั้นตอนการยืนยันหรือไม่ (โดยซ่อน UI การยืนยันไว้จนกว่าการตรวจสอบความถูกต้องอื่นจะผ่านไป)


77

ไม่จำเป็นต้องมีความเกลียดชัง TempData ... แต่ถ้าใช้ไม่ถูกต้องก็อาจบ่งบอกถึงการออกแบบที่ไม่ดีได้ หากคุณกำลังใช้ RESTful URL อยู่ TempData เป็นแนวทางปฏิบัติที่ดีที่สุดสำหรับการถ่ายโอนข้อความจาก POST Actions ไปยัง GET Actions พิจารณาสิ่งนี้:

คุณมีแบบฟอร์มที่ผลิตภัณฑ์ URL / ใหม่ แบบฟอร์มโพสต์ไปยังผลิตภัณฑ์ / สร้างซึ่งตรวจสอบความถูกต้องของแบบฟอร์มและสร้างผลิตภัณฑ์เมื่อสำเร็จตัวควบคุมจะเปลี่ยนเส้นทางไปยังผลิตภัณฑ์ URL / 1 และเมื่อเกิดข้อผิดพลาดจะเปลี่ยนเส้นทางกลับไปยังผลิตภัณฑ์ / ใหม่เพื่อแสดงข้อความแสดงข้อผิดพลาด

ผลิตภัณฑ์ / 1 เป็นเพียงการดำเนินการ GET มาตรฐานสำหรับผลิตภัณฑ์ แต่เราต้องการให้ข้อความแสดงว่าการแทรกประสบความสำเร็จ TempData เหมาะสำหรับสิ่งนี้ เพิ่มข้อความลงใน TempData ใน Post Controller และใส่ตรรกะ if ไว้ในมุมมองและทำเสร็จแล้ว

ในความล้มเหลวฉันได้เพิ่มค่าที่ป้อนใน formCollection และชุดของข้อความแสดงข้อผิดพลาดไปยัง TempData ใน Post Action และเปลี่ยนเส้นทางไปยัง Intial Action Prodcuts / New ฉันได้เพิ่มตรรกะในมุมมองเพื่อเติมข้อมูลอินพุตแบบฟอร์มด้วยค่าที่ป้อนก่อนหน้านี้พร้อมกับข้อความแสดงข้อผิดพลาด ดูเหมือนดีและสะอาดสำหรับฉัน!


1
ทำที่ทำงานพิเศษทำไมเมื่อคุณสามารถโพสต์โดยตรงกลับไปProducts/New? Products/Createเพิ่มคุณค่าอะไร
mpen

2
@Mark โดยใช้ผลิตภัณฑ์ / สร้างจะป้องกันไม่ให้สถานการณ์ที่ผู้ใช้ดำเนินการเสร็จสิ้นผ่านการโพสต์แบ็คจากนั้นในการรีเฟรชในภายหลัง (หรือบุ๊กมาร์กและการส่งคืน) จะทำให้การดำเนินการเสร็จสมบูรณ์โดยไม่ได้ตั้งใจ ดูข้อมูลเพิ่มเติมได้ที่en.wikipedia.org/wiki/Post/Redirect/Get
ehdv

3
@ehdv: แต่มันจริงเหรอ? เมื่อประสบความสำเร็จระบบจะเปลี่ยนเส้นทางไปยังหน้าอื่นหากเกิดความล้มเหลวควรแสดงข้อผิดพลาดของฟอร์มและไม่ควรดำเนินการใด ๆ จึงไม่เกิดอันตรายใด ๆ มันจะป้องกันข้อความ "คุณแน่ใจหรือว่าต้องการโพสต์ซ้ำ" ซึ่งฉันมักจะต้องการ ฉันเดาว่ามันขึ้นอยู่กับการออกแบบของคุณดังนั้นฉันจึงเห็นจุดของคุณ
mpen

31

ฉันคิดว่าคุณควรลังเลก่อนที่จะใช้ TempData TempData ถูกเก็บไว้ในเซสชันและอาจมีผลกระทบต่อคุณหาก:

  1. คุณไม่ได้ใช้เซสชันบนไซต์ของคุณในขณะนี้
  2. คุณมีระบบที่ต้องปรับขนาดให้มีปริมาณงานสูงกล่าวคือคุณต้องการหลีกเลี่ยงสถานะเซสชันโดยสิ้นเชิง
  3. คุณไม่ต้องการใช้คุกกี้ (ฉันไม่รู้ว่า MVC รองรับเซสชันที่ไม่มีคุกกี้ได้ดีแค่ไหนในตอนนี้)

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


16
TempData ไม่จำเป็นต้องเก็บไว้ในเซสชันแม้ว่าจะเป็นผู้ให้บริการเริ่มต้นซึ่งอาจเป็นสาเหตุที่ไม่ได้อยู่ใน method doc มีผู้ให้บริการคุกกี้อยู่ที่นั่นเช่นกันเป็นตัวอย่างวิธีการเขียนผู้ให้บริการที่กำหนดเอง
FinnNk

3

ฉันมีเมธอด GetModel ซึ่งก่อนอื่นจะตรวจสอบ TempData ["model"] และส่งคืนค่านั้น มิฉะนั้น GetModel จะโหลดข้อมูลที่เหมาะสมจากฐานข้อมูล

บันทึกการโหลดเพิ่มเติมจากฐานข้อมูลเมื่อฉันมีการดำเนินการที่ต้องการส่งคืนมุมมองอื่นที่ต้องใช้ข้อมูลโมเดลเดียวกัน


ใช่ฉันได้พบกับสิ่งนี้: (1) ตรวจสอบความถูกต้องของระเบียนที่มีอยู่ถ้าถูกต้องให้เปลี่ยนเส้นทางไปยังหน้า (2) โหลดบันทึกเพื่อแสดงสำหรับผู้ใช้ ดังนั้นฐานข้อมูลจึงได้รับผลกระทบสำหรับการตรวจสอบความถูกต้องและสำหรับการแสดงผล ฉันเกือบจะใช้ TempData สำหรับสิ่งนี้ แต่รู้สึกเหมือนกำลังตรวจสอบความคิดเห็น ฉันชอบวิธีการของคุณที่จะมีมัน
ไม่ระบุชื่อ

ควรใช้กลไกการแคชที่เหมาะสมในสถานการณ์นี้
nicodemus13

3

ตรวจสอบตัวควบคุมแบบไม่มีเซสชันใน MVC3 ปรากฎว่าการใช้เซสชันป้องกันการดำเนินการแบบขนานของคำขอของผู้ใช้คนเดียวและทำให้ประสิทธิภาพลดลง

เนื่องจาก tempdata ใช้เซสชันโดยค่าเริ่มต้นคุณจะไม่สามารถใช้คุณสมบัตินี้ได้ คุณสามารถเปลี่ยนไปใช้คุกกี้สำหรับ tempdata ได้ แต่มันค่อนข้างอึดอัด (อย่างน้อยสำหรับฉัน) ยังคงสะอาดกว่า viewstate ดังนั้นอาจจะไม่ใช่ตัวทำลายข้อตกลงใหญ่


2
คุณถูกต้องเกี่ยวกับ Sessionless Controllers และ TempData ใช้ Session แต่เดี๋ยวก่อน! เซสชันไม่ใช่เรื่องเลวร้ายและคุณสามารถผสมผสาน Sessionless กับตัวควบคุมเซสชันได้ คุณต้องการตัวควบคุม Session_less_ จริงๆเมื่อคุณทำการเรียก AJAX จำนวนมากไปยังเซิร์ฟเวอร์ (จากเบราว์เซอร์) เมื่อคุณกดปุ่มหน้าเดียว -at-a-time- .. คุณไม่จำเป็นต้องไม่มีเซสชั่น ในความเป็นจริงนั่นไม่ควรให้ประโยชน์ใด ๆ กับคุณ ... เพราะคุณกำลังกดปุ่มเซิร์ฟเวอร์ ONCE เท่านั้น ดังนั้นจึงเป็นไปได้ที่จะมิกซ์แอนด์แมทช์
Pure.Krome

2

ทำไมคุณถึงเกลียดชัง? สิ่งนี้เป็นเพียงการทำงานและทำให้ดี :)

หากคุณไม่ชอบเนื่องจากไม่ได้พิมพ์อย่างรุนแรงคุณสามารถสร้างกระดาษห่อหุ้มซึ่งจะให้อินเทอร์เฟซที่พิมพ์ยาก


2

เหมือนกับการใช้ ViewData ซึ่งหมายความว่าอาจไม่ใช่ความเสี่ยงด้านความปลอดภัย แต่ฉันอยากจะใช้ ViewData มากกว่า TempData ตรวจสอบเปรียบเทียบได้ที่นี่: http://www.squaredroot.com/2007/12/20/mvc-viewdata-vs-tempdata/

ขึ้นอยู่กับการออกแบบคุณสามารถจัดเก็บผู้ใช้ / ตะกร้าหรือสิ่งที่คุณต้องการใน tempdata ในฐานข้อมูลได้ตลอดเวลาและมีเพียงช่อง "IsReady" ซึ่งระบุว่าเสร็จสมบูรณ์หรือไม่ทำให้สามารถขยายได้ในภายหลังหากคุณต้องการเข้าร่วม ผู้คนสามารถปิดเบราว์เซอร์ของตนได้


2
หมายเหตุ: บทความที่คุณเชื่อมโยงเป็นปัจจุบันตามเวลา แต่จะถูกต้องสำหรับ MVC1 เท่านั้น TempData เปลี่ยนไปอย่างมากใน MVC2
mikemanne

@mikemanne ใช่ แต่คำตอบมาจากปลายปี 2008 แต่คำตอบควรได้รับการปรับปรุงหรือไม่?
Filip Ekberg

0

คำตอบที่ดีทั้งหมดคุณได้ดูสิ่งนี้เพื่อส่งต่อข้อความหรือไม่

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

ที่กล่าวมานี้ให้ดูที่การใช้ TempData สำหรับการส่งข้อความที่นี่

http://jameschambers.com/2014/06/day-14-bootstrap-alerts-and-mvc-framework-tempdata/

Mabye สิ่งนี้สามารถปรับให้เข้ากับการใช้วิธีสตริงการสืบค้นได้หากใช้สำหรับการเปลี่ยนเส้นทางไปยังการแจ้งเตือนหน้าอื่นเท่านั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.