ความแตกต่างระหว่าง ViewData และ TempData?


95

ฉันรู้ว่า ViewData คืออะไรและใช้ตลอดเวลา แต่ใน ASP.NET Preview 5 พวกเขาได้แนะนำสิ่งใหม่ที่เรียกว่า TempData

โดยปกติฉันจะพิมพ์ ViewData ของฉันอย่างรุนแรงแทนที่จะใช้วิธีการพจนานุกรมของวัตถุ

ดังนั้นฉันควรใช้ TempData แทน ViewData เมื่อใด

มีแนวทางปฏิบัติที่ดีที่สุดสำหรับสิ่งนี้หรือไม่?


ฉันต้องการจะเพิ่มบางอย่างเกี่ยวกับTempDataที่นี่stackoverflow.com/a/17199709/2015869
Imad Alazani

คำตอบ:


96

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

แม้ว่าจะล้าสมัย แต่บทความนี้มีคำอธิบายที่ดีเกี่ยวกับTempDataวงจรชีวิต

ดังที่ Ben Scheirman กล่าวไว้ที่นี่ :

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


ฉันคิดว่านั่นเป็นความแตกต่างที่ยิ่งใหญ่ซึ่งTempDataจะเกี่ยวข้องกับบางสิ่งที่อาจซับซ้อนกว่า (เซสชัน) มากกว่าพจนานุกรมง่ายๆที่ส่งต่อจากวิธีการหนึ่งวิธี
Matti Virkkunen

29

เมื่อการดำเนินการส่งคืนผลลัพธ์ RedirectToAction จะทำให้เกิดการเปลี่ยนเส้นทาง HTTP (เทียบเท่ากับ Response.Redirect) ข้อมูลสามารถเก็บรักษาไว้ในคุณสมบัติ TempData (พจนานุกรม) ของคอนโทรลเลอร์สำหรับช่วงเวลาของการร้องขอการเปลี่ยนเส้นทาง HTTP ครั้งเดียว


ค่าของ ViewData จะยังคงอยู่ในกรณีเดียวกันหรือไม่
IsmailS

9
@Ismail: ไม่ ViewData จะไม่เก็บรักษาข้อมูลผ่าน Redirect นั่นคือความแตกต่างหลักของ TempData
Mariano Desanze

5

ViewData:

  • ViewData เป็นประเภทพจนานุกรม public ViewDataDictionary ViewData { get; set; }
  • สามารถใช้เพื่อส่งผ่านข้อมูลจากคอนโทรลเลอร์ไปยังมุมมองได้ทางเดียวเท่านั้น
  • ชีวิตอยู่ระหว่างการร้องขอในปัจจุบันเท่านั้น
  • หากผ่านสตริงก็ไม่จำเป็นต้องพิมพ์คาสต์
  • หากผ่านวัตถุคุณต้องพิมพ์คาสต์ แต่ก่อนหน้านั้นคุณต้องตรวจสอบว่ามันไม่เป็นโมฆะหรือไม่
  • คุณสมบัติบนControllerBaseซึ่งเป็นผู้ปกครองของControllerคลาส

TempData:

  1. TempDataใช้ภายในTempDataDictionary:public TempDataDictionary TempData { get; set; }
  2. เมื่อข้อมูลถูกบันทึกลงในTempDataDictionaryวัตถุ:
    • มันยังคงอยู่และสามารถอ่านได้จากมุมมองหรือการกระทำใด ๆ ในคอนโทรลเลอร์ใด ๆ
    • สามารถอ่านได้ครั้งเดียวเท่านั้น เมื่ออ่านแล้วจะกลายเป็นโมฆะ
    • จะถูกบันทึกลงในเซสชันดังนั้นเมื่อข้อมูลเซสชันหมดอายุจะสูญหายไป

ลักษณะการทำงานนี้เป็นสิ่งใหม่จาก ASP.NET MVC 2 และเวอร์ชันหลัง ใน ASP.NET MVC เวอร์ชันก่อนหน้าค่าในTempDataจะพร้อมใช้งานจนกว่าจะมีการร้องขอถัดไป

  1. มันยังมีชีวิตอยู่จนกว่าจะอ่านหรือเซสชันหมดอายุและสามารถอ่านได้จากทุกที่

ดูการเปรียบเทียบ ViewData, ViewBag, TempData และ Session ใน MVC โดยละเอียด


4

ฉันพบว่าการเปรียบเทียบนี้มีประโยชน์: http://www.dotnet-tricks.com/Tutorial/mvc/9KHW190712-ViewData-vs-ViewBag-vs-TempData-vs-Session.html

gotcha หนึ่งที่ฉันเจอคือค่า TempData จะถูกล้างหลังจากอ่านตามค่าเริ่มต้น มีตัวเลือกที่จะดู Peek 'วิธีการและ 'เก็บ' ใน MSDN สำหรับข้อมูลเพิ่มเติม


0

ดูข้อมูลถูกใช้เมื่อเราต้องการส่งผ่านข้อมูลจากคอนโทรลเลอร์ไปยังมุมมองที่เกี่ยวข้อง ดูข้อมูลมีอายุการใช้งานสั้นมากหมายความว่าข้อมูลจะถูกทำลายเมื่อเกิดการเปลี่ยนเส้นทาง ตัวอย่าง (ตัวควบคุม):

public ViewResult try1()
    {
        ViewData["DateTime"] = DateTime.Now;
        ViewData["Name"] = "Mehta Hitanshi";
        ViewData["Twitter"] = "@hitanshi";
        ViewData["City"] = "surat";
        return View();
    }

try1.cshtm

<table>
<tr>
    <th>Name</th>
    <th>Twitter</th>
    <th>Email</th>
    <th>City</th>
    <th>Mobile</th>
</tr>
<tr>
    <td>@ViewData["Name"]</td>
    <td>@ViewData["Twitter"]</td>
    <td>@ViewData["City"]</td>
</tr>
</table> 

TempData ถ่ายโอนข้อมูลระหว่างตัวควบคุมหรือระหว่างการดำเนินการ ใช้เพื่อเก็บข้อความครั้งเดียวและอายุการใช้งานสั้นมากเราสามารถใช้ TempData.Keep () เพื่อให้พร้อมใช้งานผ่านการกระทำทั้งหมดหรือเพื่อให้เป็นแบบถาวร

ตัวอย่าง (ตัวควบคุม):

public ActionResult try3()
    {
        TempData["DateTime"] = DateTime.Now;
        TempData["Name"] = "Ravina";
        TempData["Twitter"] = "@silentRavina";
        TempData["Email"] = "Ravina12@gmail.com";
        TempData["City"] = "India";
        TempData["MobNo"] = 9998975436;
        return RedirectToAction("TempView1");
    }
    public ActionResult TempView1()
    {
        return View();
    }

TempView1.cshtm

<table>
<tr>
    <th>Name</th>
    <th>Twitter</th>
    <th>Email</th>
    <th>City</th>
    <th>Mobile</th>
</tr>
<tr>
    <td>@TempData["Name"]</td>
    <td>@TempData["Twitter"]</td>
    <td>@TempData["Email"]</td>
    <td>@TempData["City"]</td>
    <td>@TempData["MobNo"]</td>
</tr>
</table>

0

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

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