Store complex object in TempData

做~自己de王妃 提交于 2019-11-26 10:41:03

问题


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 The Microsoft.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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!