当前位置:  开发笔记 > 编程语言 > 正文

将复杂对象存储在TempData中

如何解决《将复杂对象存储在TempData中》经验,为你挑选了2个好方法。

我一直试图通过使用TempData重定向后将数据传递给一个动作,如下所示:

if (!ModelState.IsValid)
{
    TempData["ErrorMessages"] = ModelState;
    return RedirectToAction("Product", "ProductDetails", new { code = model.ProductCode });
}

但不幸的是,它失败了以下消息:

" System.InvalidOperationExceptionMicrosoft.AspNet.Mvc.SessionStateTempDataProvider'不能序列类型的对象'ModelStateDictionary'到会话状态".

我在Github的MVC项目中发现了一个问题,但是虽然它解释了为什么我收到这个错误,但我看不出什么是可行的替代方案.

一种选择是将对象序列化为json字符串,然后将其反序列化并重新构建ModelState.这是最好的方法吗?我需要考虑哪些潜在的性能问题?

最后,是否有任何替代方法可以序列化复杂对象或使用其他不涉及使用的模式TempData



1> hem..:

您可以像这样创建扩展方法:

public static class TempDataExtensions
{
    public static void Put(this ITempDataDictionary tempData, string key, T value) where T : class
    {
        tempData[key] = JsonConvert.SerializeObject(value);
    }

    public static T Get(this ITempDataDictionary tempData, string key) where T : class
    {
        object o;
        tempData.TryGetValue(key, out o);
        return o == null ? null : JsonConvert.DeserializeObject((string)o);
    }
}

并且,您可以按如下方式使用它们:

objectA是类型ClassA.你可以使用上面提到的扩展方法将它添加到临时数据字典中,如下所示:

TempData.Put("key", objectA);

要检索它,你可以这样做:

var value = TempData.Get("key") 其中value检索将型ClassA



2> Chris Go..:

我无法发表评论,但我也添加了PEEK,非常适合检查是否存在或已阅读,并且不能删除下一个GET。

public static T Peek(this ITempDataDictionary tempData, string key) where T : class
{
    object o = tempData.Peek(key);
    return o == null ? null : JsonConvert.DeserializeObject((string)o);
}

var value = TempData.Peek("key") where value retrieved will be of type ClassA

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有