asp.net-mvc - mvc - viewbag vs viewdata
Cuál es el momento adecuado para ViewData, ViewBag, Session, TempData (3)
ASP.net MVC introdujo ViewData, ViewBag, TempData, Session para pasar datos entre el controlador y la vista.
Ver datos
ViewData se implementa utilizando la clase ViewDataDictionary que se almacena en CurrentRequestContext . Por lo tanto, el ciclo de vida de ViewData finalizará cuando finalice la solicitud actual.
ViewBag también es como ViewData, y la única diferencia es que permite compartir dinámicamente los datos utilizando objetos dinámicos.
TempData es una instancia de muy corta vida, y solo debe usarla solo durante las solicitudes actuales y subsiguientes. Esto será útil si quiere usar Redirecciones (RedirectToAction, RedirectToRoute, Redirect) en ASP.net MVC y pasar algunos datos entre los redireccionamientos. TempData almacena datos en Session pero framework descarta los datos cuando finalizan las solicitudes actuales y subsiguientes.
La sesión es de larga duración (nunca caduca) datos que pertenecen a la sesión del usuario. Debe tener en cuenta cuando utiliza variables de sesión que pueden ser fácilmente causa de problemas.
protected void Session_Start(Object sender, EventArgs e)
{
int userType = 1;
HttpContext.Current.Session.Add("_SessionUserType",userType );
}
Estaba editando un proyecto y vi una sesión [""] en un método de controlador y TempData [""] en otro. ¿Hay alguna diferencia entre los 4 o son solo 4 formas de hacer lo mismo?
Ver datos:
- Es un diccionario especial heredado de
ViewDataDictionary
. - Se usa para enviar datos desde el controlador para ver.
- Su vida útil es la solicitud actual.
- Será destruido si tienes
Redirect
. - Por razones de seguridad, es mejor comprobar si es
null
antes del uso. - El lanzamiento debe hacerse para la operación.
ViewBag:
Es un tipo dinámico (este tipo se presenta en c # 4).
Al igual que
ViewData
se usa para enviar datos del controlador a la vista.- La duración de la validez de sus valores en la solicitud actual.
- En la redirección entre páginas, su valor será nulo.
- Por razones de seguridad antes del uso, verifíquelo para
null
. - El lanzamiento no es necesario , por lo que es más rápido que
ViewData
.
TempData:
- Un tipo especial de diccionario derivado de
TempDataDictionary
. - Tiene un tiempo de vida corto y se usa para enviar información entre páginas (
Redirect
). - Después de renderizar la
View
completo, su valor seránull
. - Por razones de seguridad antes del uso, verifíquelo para
null
. - El lanzamiento debe hacerse para la operación.
Sesión:
- utilizado para enviar información entre diferentes solicitudes.
- Su valor no es
null
ni valores nulos; A menos que transcurra un tiempo determinado (lasession expire
). - Por razones de seguridad antes del uso, verifíquelo para
null
. - El lanzamiento debe hacerse para la operación.
This artículo explica la diferencia entre ViewData, ViewBag y TempData. Espero que pueda recomendar este artículo para su necesidad.
- ViewData / ViewBag - válido solo por la duración de la solicitud actual.
Lo configura en una acción de controlador y lo usa en la vista, luego desaparece.
La diferencia es que el primero es un diccionario, mientras que el segundo es simplemente un contenedordynamic
alrededor de este diccionario.
Ambos apuntan a los mismos datos sin embargo.
ViewBag se introdujo en ASP.NET MVC 3.
Ejemplo:
public ActionResult Index()
{
ViewData["foo"] = "bar";
return View();
}
y dentro de la vista puede usar este valor:
<div>@ViewData["foo"]</div>
Lo mismo con ViewBag, pero es dinámico:
public ActionResult Index()
{
ViewBag.foo = "bar";
return View();
}
y dentro de la vista puede usar este valor:
<div>@ViewBag.foo</div>
Como puede ver, ViewData / ViewBag es solo una forma alternativa de pasar información a una vista desde una acción de controlador en comparación con la forma clásica y recomendada que está usando un modelo de vista:
public class MyViewModel
{
public string Foo { get; set; }
}
y entonces:
public ActionResult Index()
{
var model = new MyViewModel { Foo = "bar" };
return View(model);
}
y dentro de su vista fuertemente tipada:
@model MyViewModel
<div>@Html.DisplayFor(x => x.Foo)</div>
Como puede ver, el uso de modelos de vista proporciona un enfoque fuertemente tipado al pasar información a una vista desde una acción del controlador.
- TempData : permite la persistencia de la información durante una única solicitud posterior. Almacena algo dentro de TempData y luego lo redirecciona. En la acción del controlador de destino a la que redirigió, puede recuperar el valor que estaba almacenado dentro de TempData.
Ejemplo:
public ActionResult Foo()
{
TempData["foo"] = "bar";
return RedirectToAction("bar");
}
public ActionResult Bar()
{
var value = TempData["foo"] as string;
// use the value here. If you need to pass it to the view you could
// use ViewData/ViewBag (I can''t believe I said that but I will leave it for the moment)
return View();
}
ASP.NET MVC expirará automáticamente el valor que se almacenó en TempData
una vez que lo haya leído. Bajo las cubiertas ASP.NET MVC persiste la información en la Session
.
- Sesión : igual que TempData, excepto que nunca caduca, será válido para todas las solicitudes, ni una sola redirección.