variable sesion not net how has for configured been asp application c# asp.net-core asp.net-core-mvc tempdata

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