Різниця між ViewData та TempData?


94

Я знаю, що таке ViewData, і постійно ним користуюся, але в ASP.NET Preview 5 вони представили щось нове під назвою TempData.

Зазвичай я сильно набираю свої ViewData, замість того, щоб використовувати словник підходу до об'єктів.

Отже, коли мені слід використовувати TempData замість ViewData?

Чи є для цього найкращі практики?


Я хотів би додати щось TempDataтут: stackoverflow.com/a/17199709/2015869
Імад Алазані

Відповіді:


94

Одним реченням: TempDataсхожі на ViewData з однією відмінністю: Вони містять дані лише між двома послідовними запитами, після чого вони знищуються. Ви можете використовувати TempDataдля передачі повідомлень про помилки або щось подібне.

Хоча ця стаття застаріла, вона добре описує TempDataжиттєвий цикл.

Як тут сказав Бен Шейрман :

TempData - це тимчасовий словник із підтримкою сеансів, який доступний для одного запиту. Чудово передавати повідомлення між контролерами.


Я думаю, що це досить велика різниця, оскільки в цьому TempDataбуде щось потенційно набагато складніше (сесія), ніж простий словник, який передається від методу до методу
Матті Вірккунен,

29

Коли дія повертає результат RedirectToAction, це викликає перенаправлення HTTP (еквівалентно Response.Redirect). Дані можуть зберігатися у властивості TempData (словнику) контролера протягом одного запиту на перенаправлення HTTP.


Чи збережеться значення ViewData в тому ж випадку?
IsmailS

9
@Ismail: Ні, ViewData не зберігатиме дані за допомогою Redirect. Це головна відмінність TempData.
Маріано Десанце

5

ViewData:

  • ViewData - тип словника public ViewDataDictionary ViewData { get; set; }
  • Він може використовуватися для передачі даних з контролера на перегляд, лише в один бік
  • Це життя лежить лише під час поточного запиту
  • Якщо передається рядок, тоді немає необхідності вводити текст
  • Якщо передається об'єкт, то вам потрібно ввести його, але перед цим потрібно перевірити, чи не є він null
  • Його властивість on 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

Одне, з чим я зіткнувся - це те, що значення TempData очищаються після прочитання за замовчуванням. Є варіанти, див. Методи "Заглянути" та "Зберегти" на 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>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.