Разница между ViewData и TempData?

94

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

Обычно я строго набираю свои ViewData вместо того, чтобы использовать подход словаря объектов.

Итак, когда мне следует использовать TempData вместо ViewData?

Есть ли лучшие практики для этого?

Elijah Manor
источник
Я хотел бы кое-что добавить TempDataсюда stackoverflow.com/a/17199709/2015869
Имад Алазани,

Ответы:

95

Одним предложением: 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; }
  • Его можно использовать для передачи данных от контроллера для просмотра, только в одну сторону
  • Его жизнь лежит только во время текущего запроса
  • При передаче строки нет необходимости приводить типы
  • При передаче объекта вам необходимо привести его к типу, но перед этим вам нужно проверить, не является ли он нулевым
  • Это свойство 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

Али Адрави
источник
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>
Hitanshi Mehta
источник