c# - sesion - Almacenar objeto complejo en TempData
variable session asp net core (2)
No puedo comentar pero también agregué un PEEK, lo cual es bueno para verificar si existe o leer y no eliminar para el próximo GET.
public static T Peek<T>(this ITempDataDictionary tempData, string key) where T : class
{
object o = tempData.Peek(key);
return o == null ? null : JsonConvert.DeserializeObject<T>((string)o);
}
Ejemplo
var value = TempData.Peek<ClassA>("key") where value retrieved will be of type ClassA
He estado tratando de pasar datos a una acción después de una redirección utilizando TempData así:
if (!ModelState.IsValid)
{
TempData["ErrorMessages"] = ModelState;
return RedirectToAction("Product", "ProductDetails", new { code = model.ProductCode });
}
pero desafortunadamente está fallando con el siguiente mensaje:
''
System.InvalidOperationException
Microsoft.AspNet.Mvc.SessionStateTempDataProvider''
no puede serializar un objeto de tipo''ModelStateDictionary''
al estado de sesión. ''
He encontrado un problema en el proyecto MVC en Github , pero si bien explica por qué recibo este error, no puedo ver cuál sería una alternativa viable.
Una opción sería serializar el objeto a una cadena json y luego deserializarlo nuevamente y reconstruir el ModelState
. ¿Es este el mejor enfoque? ¿Hay algún problema de rendimiento potencial que deba tener en cuenta?
Y, finalmente, ¿hay alternativas para serializar objetos complejos o usar algún otro patrón que no implique el uso de TempData
?
Puedes crear los métodos de extensión así:
public static class TempDataExtensions
{
public static void Put<T>(this ITempDataDictionary tempData, string key, T value) where T : class
{
tempData[key] = JsonConvert.SerializeObject(value);
}
public static T Get<T>(this ITempDataDictionary tempData, string key) where T : class
{
object o;
tempData.TryGetValue(key, out o);
return o == null ? null : JsonConvert.DeserializeObject<T>((string)o);
}
}
Y, puedes usarlos de la siguiente manera:
Digamos que objectA
es de tipo ClassA
. Puede agregar esto al diccionario de datos temporales utilizando el método de extensión mencionado anteriormente de la siguiente manera:
TempData.Put("key", objectA);
Y para recuperarlo puedes hacer esto:
var value = TempData.Get<ClassA>("key")
donde el value
recuperado será de tipo ClassA