¿Diferencia entre ViewData y TempData?

94

Sé qué es ViewData y lo uso todo el tiempo, pero en ASP.NET Preview 5 introdujeron algo nuevo llamado TempData.

Normalmente escribo fuertemente mi ViewData, en lugar de usar el método del diccionario de objetos.

Entonces, ¿cuándo debería usar TempData en lugar de ViewData?

¿Existen mejores prácticas para esto?

Elijah Manor
fuente
Me gustaría agregar algo sobre TempDataaquí stackoverflow.com/a/17199709/2015869
Imad Alazani

Respuestas:

94

En una frase: TempDatason como ViewData con una diferencia: solo contienen datos entre dos solicitudes sucesivas, después de eso se destruyen. Puede utilizar TempDatapara pasar mensajes de error o algo similar.

Aunque desactualizado, este artículo tiene una buena descripción del TempDataciclo de vida.

Como dijo Ben Scheirman aquí :

TempData es un diccionario de almacenamiento temporal respaldado por sesión que está disponible para una sola solicitud. Es genial pasar mensajes entre controladores.

Dragan Panjkov
fuente
Creo que esa es una diferencia bastante grande, ya que TempDataimplicará algo potencialmente mucho más complicado (la sesión) que un simple diccionario que se pasa de un método a otro
Matti Virkkunen
29

Cuando una acción devuelve un resultado RedirectToAction, provoca una redirección HTTP (equivalente a Response.Redirect). Los datos se pueden conservar en la propiedad TempData (diccionario) del controlador durante una sola solicitud de redireccionamiento HTTP.

Capitán Sensible
fuente
¿Se conservará el valor de ViewData en el mismo caso?
IsmailS
9
@Ismail: No, ViewData no conservará los datos a través de Redirect. Esa es la principal diferencia de TempData.
Mariano Desanze
5

Ver datos:

  • ViewData es un tipo de diccionario public ViewDataDictionary ViewData { get; set; }
  • Se puede usar para pasar datos del controlador a la vista, solo de una manera
  • Su vida miente solo durante la solicitud actual
  • Si pasa una cadena, entonces no es necesario encasillar
  • Si pasa un objeto, debe encasillarlo, pero antes de eso debe verificar si no es nulo
  • Es una propiedad de ControllerBase, que es el padre de la Controllerclase.

TempData:

  1. TempDatauso interno TempDataDictionary:public TempDataDictionary TempData { get; set; }
  2. Una vez que los datos se guardan en el TempDataDictionaryobjeto:
    • Persiste en él y se puede leer desde cualquier vista o acción en cualquier controlador
    • Solo se puede leer una vez; una vez leído, se vuelve nulo
    • Se guarda en la sesión, por lo que al expirar la sesión se pierden los datos.

Este comportamiento es nuevo en ASP.NET MVC 2 y versiones posteriores. En versiones anteriores de ASP.NET MVC, los valores de TempDataestaban disponibles solo hasta la siguiente solicitud.

  1. Está vivo, hasta que se lee o la sesión expira y se puede leer desde cualquier lugar.

Vea la comparación de ViewData, ViewBag, TempData y Session en MVC en detalle

Ali Adravi
fuente
0

Los datos de vista se utilizan cuando queremos pasar datos del controlador a la vista correspondiente. Los datos de visualización tienen una vida muy corta, lo que significa que se destruirán cuando se produzca la redirección. Ejemplo (controlador):

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 transfiere los datos entre controladores o entre acciones. Se usa para almacenar mensajes únicos y su vida es muy corta. Podemos usar TempData.Keep () para que esté disponible a través de todas las acciones o para que sea persistente.

Ejemplo (controlador):

public ActionResult try3()
    {
        TempData["DateTime"] = DateTime.Now;
        TempData["Name"] = "Ravina";
        TempData["Twitter"] = "@silentRavina";
        TempData["Email"] = "[email protected]";
        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
fuente