Разница между ViewData и TempData? - PullRequest
92 голосов
/ 06 октября 2008

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

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

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

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

Ответы [ 6 ]

91 голосов
/ 06 октября 2008

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

Хотя эта статья устарела, содержит хорошее описание жизненного цикла TempData.

Как сказал Бен Шейрман здесь :

TempData - это словарь временного хранилища, поддерживаемый сеансом, который доступен для одного запроса. Замечательно передавать сообщения между контроллерами.

29 голосов
/ 21 января 2009

Когда действие возвращает результат RedirectToAction, оно вызывает перенаправление HTTP (эквивалентно Response.Redirect). Данные могут быть сохранены в свойстве TempData (словарь) контроллера на время одного запроса перенаправления HTTP.

5 голосов
/ 14 июня 2017

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 голосов
/ 03 октября 2014

Мне показалось это сравнение полезным: http://www.dotnet -tricks.com / Tutorial / mvc / 9KHW190712-ViewData-vs-ViewBag-vs-TempData-vs-Session.html

Одна ошибка, с которой я столкнулся, заключается в том, что значения TempData очищаются после того, как они прочитаны по умолчанию. Существуют варианты, см. Методы 'Peek' и 'Keep' на Msdn для получения дополнительной информации .

0 голосов
/ 16 февраля 2019

Просто примечание к TempData.
Данные в нем хранятся не до следующего следующего запроса , а до следующего вызова следующей операции !
См:
TempData не будет уничтожен после второго запроса

0 голосов
/ 22 июля 2018

данные представления используются, когда мы хотим передать данные из контроллера в соответствующее представление. просмотр данных имеет очень короткий срок службы, это означает, что он будет уничтожен при перенаправлении. Пример (контроллер):

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...