Buscar..


Introducción

ViewData y ViewBag se utilizan para transferir datos desde el controlador para ver.

ViewData no es más que un diccionario de objetos y es accesible por cadena como clave.

ViewBag es muy similar a ViewData. ViewBag es una propiedad dinámica. ViewBag es solo una envoltura alrededor de ViewData.

TempData mantiene los datos durante el tiempo de la solicitud HTTP, lo que significa que mantiene los datos entre dos solicitudes consecutivas. TempData nos ayuda a transferir datos entre controladores o entre acciones. Usos de sesión interna.

Sintaxis

  1. ViewData [clave] = valor;

  2. ViewBag.Key = valor;

  3. TempData [clave] = valor;

¿Qué son ViewData, ViewBag y TempData?

ViewData es el mecanismo para que un controlador proporcione datos a la vista que presenta, sin usar ViewModel. Específicamente, ViewData es un diccionario que está disponible tanto en los métodos de acción MVC como en las vistas. Puede usar ViewData para transferir algunos datos de su método de acción a la vista devuelta por el método de acción.

Como es un diccionario, puede usar el diccionario como sintaxis para configurar y obtener datos de él.

ViewData[key] = value; // In the action method in the controller

Por ejemplo, si desea pasar un mensaje de cadena de su método de acción de índice a su vista de índice Index.cshtml , puede hacer esto.

public ActionResult Index()
{
   ViewData["Message"] = "Welcome to ASP.NET MVC";
   return View(); // notice the absence of a view model
}

Para acceder a esto en su vista Index.cshtml , simplemente puede acceder al diccionario ViewData con la tecla utilizada en el método de acción.

<h2>@ViewData["Message"]</h2>

ViewBag es el equivalente dinámico del diccionario ViewData sin tipo. Aprovecha el tipo dynamic C # para la experiencia del azúcar sintáctico.

La sintaxis para configurar algunos datos para ViewBag es

ViewBag.Key = Value;

Entonces, si queremos pasar la cadena de mensaje en nuestro ejemplo anterior usando ViewBag, será

public ActionResult Index()
{
   ViewBag.Message = "Welcome to ASP.NET MVC";
   return View(); // not the absence of a view model
}

y en su vista de índice,

<h2>@ViewBag.Message</h2>

Los datos no se comparten entre ViewBag y ViewData. ViewData requiere encasillado para obtener datos de tipos de datos complejos y buscar valores nulos para evitar errores cuando View Bag no requiere encasillado.

TempData se puede usar cuando desea conservar datos entre una solicitud http y la siguiente solicitud HTTP solamente. La vida útil de los datos almacenados en TempDataDictionary finaliza después de la segunda solicitud. Por lo tanto, TempData es útil en situaciones en las que estás siguiendo el patrón PRG.

[HttpPost]
public ActionResult Create(string name)
{
   // Create a user
   // Let's redirect (P-R-G Pattern)
   TempData["Message"] = "User created successfully";
   return RedirectToAction("Index");
}
public ActionResult Index()
{
  var messageFromPreviousCall = TempData["Message"] as String;
  // do something with this message
  // to do : Return something
}

Cuando return RedirectToAction("SomeActionMethod") , el servidor enviará una respuesta 302 al cliente (navegador) con el valor del encabezado de ubicación establecido en la URL a "SomeActionMethod" y el navegador le enviará una solicitud totalmente nueva. ViewBag / ViewData no funcionará en ese caso para compartir algunos datos entre estas 2 llamadas. Necesitas usar TempData en tales escenarios.

Ciclo de vida de TempData

Los datos guardados en TempData se almacenan en la sesión y se eliminarán automáticamente al final de la primera solicitud donde se accede a los datos. Si nunca se lee, se mantendrá hasta que finalmente se lea o la sesión se agote.

El uso típico se parece a la siguiente secuencia (donde cada línea se invoca desde una solicitud diferente):

//first request, save value to TempData
TempData["value"] = "someValueForNextRequest";

//second request, read value, which is marked for deletion
object value = TempData["value"];

//third request, value is not there as it was deleted at the end of the second request
TempData["value"] == null

Este comportamiento puede ser más controlado con los métodos Peek y Keep .

  • Con Peek puede recuperar los datos almacenados en TempData sin marcarlos para eliminarlos, por lo que los datos seguirán estando disponibles en una futura solicitud.

    //first request, save value to TempData
    TempData["value"] = "someValueForNextRequest";
    
    //second request, PEEK value so it is not deleted at the end of the request
    object value = TempData.Peek("value");
    
    //third request, read value and mark it for deletion
    object value = TempData["value"];
    
  • Con Keep , puede especificar que una clave que se marcó para su eliminación debería conservarse. En este caso, recuperar los datos y guardarlos para eliminarlos requiere 2 llamadas de método:

    //first request, save value to TempData
    TempData["value"] = "someValueForNextRequest";
    
    //second request, get value marking it from deletion
    object value = TempData["value"];
    //later on decide to keep it
    TempData.Keep("value");
    
    //third request, read value and mark it for deletion
    object value = TempData["value"];
    

Con esto en mente, use Peek cuando siempre quiera conservar el valor para otra solicitud y use Keep cuando el valor se Keep dependiendo de la lógica adicional.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow