问题
I\'ve been trying to pass data to an action after a redirect by using TempData like so:
if (!ModelState.IsValid)
{
TempData[\"ErrorMessages\"] = ModelState;
return RedirectToAction(\"Product\", \"ProductDetails\", new { code = model.ProductCode });
}
but unfortunately it\'s failing with the following message:
\'
System.InvalidOperationException
TheMicrosoft.AspNet.Mvc.SessionStateTempDataProvider\'
cannot serialize an object of type\'ModelStateDictionary\'
to session state.\'
I\'ve found an issue in the MVC project in Github, but while it explains why I\'m getting this error, I can\'t see what would be a viable alternative.
One option would be to serialize the object to a json string and then deserialize it back and reconstruct the ModelState
. Is this the best approach? Are there any potential performance issues I need to take into account?
And finally, are there any alternatives for either serializing complex object or using some other pattern that doesn\'t involve using TempData
?
回答1:
You can create the extension methods like this:
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);
}
}
And, you can use them as follows:
Say objectA
is of type ClassA
. You can add this to the temp data dictionary using the above mentioned extension method like this:
TempData.Put("key", objectA);
And to retrieve it you can do this:
var value = TempData.Get<ClassA>("key")
where value
retrieved will be of type ClassA
回答2:
I can not comment but I added a PEEK as well which is nice to check if there or read and not remove for the next 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);
}
Example
var value = TempData.Peek<ClassA>("key") where value retrieved will be of type ClassA
来源:https://stackoverflow.com/questions/34638823/store-complex-object-in-tempdata